¿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!


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;
}
 ...

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

@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;
    }
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.