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.