¿Cómo redirigir una URL única en nginx?

111

Estoy en el proceso de reorganizar la estructura de la URL. Necesito configurar reglas de redireccionamiento para URL específicas; estoy usando NGINX.

Básicamente algo como esto:

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

¡Gracias!

tokmak
fuente
3
¿Es "isse" o "problema"? Las respuestas asumen "problema" ...
Matthew Wilcoxson
es un problema, se corrigió el error tipográfico
tokmak

Respuestas:

122

Pon esto en la directiva de tu servidor:

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

O duplicarlo:

location /issue1 {
   rewrite ^/.* http://$server_name/shop/issues/custom_issue_name1 permanent;
}
location /issue2 {
   rewrite ^.* http://$server_name/shop/issues/custom_issue_name2 permanent;
}
 ...
ValienteNuevoMoneda
fuente
139
location ~ /issue([0-9]+) {
    return 301 http://example.com/shop/issues/custom_isse_name$1;
}
Mohammad AbuShady
fuente
@Cybolic Acabo de probar esto en una imagen de la ventana acoplable con la versión 1.10.3y estuvo bien, ¿podría proporcionar su archivo de configuración de alguna manera? Probablemente te estás perdiendo algo.
Mohammad AbuShady
34

Si necesita duplicar más de unos pocos redireccionamientos, podría considerar usar un 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
fuente
4
Esto es lo que vine aquí a buscar: ponerlos en un archivo incluido es una excelente manera de reemplazar mi archivo .htaccess lleno de RewriteRules de Apache.
Josh de Qaribou
3
¿Cómo combinaría este enfoque de mapa con una ubicación existente / ... configuración de tipo proxy_pass?
Michael Dausmann
En la @redirect-mapubicación, puede probar if ($redirect_uri = "") {return 404;}seguido de proxy_pass. Podría necesitar una reescritura usando $redirect_uri.
Cole Tierney
Esto podría ser necesario en lugar de los 2 locationbloques según su configuración. Esto es para Craft CMS, por ejemplo. location ~ ^(.*)$ { if ($redirect_uri) { # redirect if the variable is defined return 301 $redirect_uri; } try_files $uri $uri/ /index.php?p=$uri&$args; }
luwes