Como redirecionar url único no nginx?


111

Estou reorganizando a estrutura do url. Preciso configurar regras de redirecionamento para urls específicas - estou usando o NGINX.

Basicamente, algo assim:

http://example.com/issue1 --> http://example.com/shop/issues/custom_issue_name1
http://example.com/issue2 --> http://example.com/shop/issues/custom_issue_name2
http://example.com/issue3 --> http://example.com/shop/issues/custom_issue_name3

Obrigado!


3
É "isse" ou "problema"?! As respostas presumem "problema" ...
Matthew Wilcoxson

É o problema, corrigiu o erro de digitação
tokmak de

Respostas:


122

Coloque isso na diretiva do seu servidor:

location /issue {
   rewrite ^/issue(.*) http://$server_name/shop/issues/custom_issue_name$1 permanent;
 }

Ou duplique-o:

location /issue1 {
   rewrite ^/.* http://$server_name/shop/issues/custom_issue_name1 permanent;
}
location /issue2 {
   rewrite ^.* http://$server_name/shop/issues/custom_issue_name2 permanent;
}
 ...

139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}

@Cybolic Acabei de testar isso em uma imagem do docker com a versão 1.10.3e funcionou. Você poderia fornecer seu arquivo de configuração de alguma forma? Você provavelmente está faltando alguma coisa.
Mohammad AbuShady

34

Se precisar duplicar mais do que alguns redirecionamentos, você pode considerar o uso de um mapa:

# map is outside of server block
map $uri $redirect_uri {
    ~^/issue1/?$    http://example.com/shop/issues/custom_isse_name1;
    ~^/issue2/?$    http://example.com/shop/issues/custom_isse_name2;
    ~^/issue3/?$    http://example.com/shop/issues/custom_isse_name3;
    # ... or put these in an included file
}

location / {
    try_files $uri $uri/ @redirect-map;
}

location @redirect-map {
    if ($redirect_uri) {  # redirect if the variable is defined
        return 301 $redirect_uri;
    }
}

4
É isso que vim aqui procurar - colocá-los em um arquivo incluído é uma excelente maneira de substituir meu arquivo .htaccess cheio de RewriteRules do apache.
Josh de Qaribou

3
como você combinaria esta abordagem de mapa com um local existente / ... configuração do tipo proxy_pass?
Michael Dausmann

No @redirect-maplocal, você pode tentar if ($redirect_uri = "") {return 404;}seguir por proxy_pass coisas. Pode precisar de uma reescrita usando $redirect_uri.
Cole Tierney

Isso pode ser necessário em vez dos 2 locationblocos, dependendo de sua configuração. Isso é para Craft CMS, por exemplo. location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
luwes de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.