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!

tokmak
fonte
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;
}
 ...
BraveNewCurrency
fonte
139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}
Mohammad AbuShady
fonte
@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;
    }
}
Cole Tierney
fonte
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