Nginx redirige una ruta a otra


51

Estoy seguro de que esto se ha preguntado antes, pero no puedo encontrar una solución que funcione.

Un sitio web ha cambiado los servicios de CMS, pero tiene el mismo dominio, ¿cómo configuro una reescritura de nginx para una sola página?

P.ej

Página antigua

http://sitedomain.co.uk/content/unique-page-name

Nueva pagina

http://sitedomain.co.uk/new-name/unique-page-name

Tenga en cuenta que no quiero que todo el contenido de la página de contenido sea redirigido, pero literalmente solo la URL mencionada anteriormente. Tengo alrededor de 9 redireccionamientos para configurar, ninguno de los cuales se ajusta a un patrón.

¡Gracias!

Editar: Encontré esta solución, que parece estar funcionando, excepto por el hecho de que redirige sin una barra:

if ( $request_filename ~ content/unique-page-name/ ) {
   rewrite ^ http://sitedomain.co.uk/new-name/unique-page-name/? permanent;
}

Pero esto redirige a:

http://sitedomain.co.uknew-name/unique-page-name/

Respuestas:


87

Cita directa de trampas y errores comunes: Reescritura de impuestos :

Al usar la directiva return podemos evitar por completo la evaluación de la expresión regular.

Úselo en returnlugar de rewritepara redireccionamientos permanentes. Este es mi enfoque para este caso de uso ...

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

1
Definitivamente es más legible. ¿Esto también retendrá las consultas que estaban en la URL original?
SteveEdson

1
No. No lo hará. Si realmente desea retener cualquier consulta sobre redirecciones permanentes, vea este pequeño truco ... gist.github.com/pothi/7152399
Pothi Kalimuthu

1
¿Estoy en lo cierto al pensar que usar ifdeclaraciones en nginx es malo? ¿Sería esto una mejor práctica que usar el método de reescritura?
SteveEdson

1
Usar ifjunto con la directiva de retorno está perfectamente bien. Ver wiki.nginx.org/IfIsEvil . Sí, en mi opinión, es mejor que usar reescribir.
Pothi Kalimuthu

13

Idealmente, no deberías usar sentencias if si puedes evitarlo. Algo como esto podría funcionar (no probado).

location ~ /content/(.*)$ {
    rewrite ^ /new-name/$1?$args permanent;
} 

1
¿No captaría eso todo dentro del directorio de contenido? Solo quiero redirigir el elemento individual. Por ejemplo, tengo otro elemento en el directorio de contenido, pero lo necesito redirigiendo a ... / another-new-name / unique-page-
name2

1
Lo he resuelto Resulta que redirige correctamente, pero el script que estaba golpeando estaba destrozando la URL después.
SteveEdson

1
Ah, entendí mal la pregunta. Pensé que solo querías cambiar la parte del contenido. El principio sigue siendo el mismo. Me alegra que te esté funcionando.
Gevious

1
No hay problema, gracias por la ayuda, definitivamente necesitaré usar eso en el futuro.
SteveEdson

12

Usé la siguiente solución:

rewrite ^(/content/unique-page-name)(.*)$   http://sitedomain.co.uk/new-name/unique-page-name/$2 permanent;

Funciona de maravilla.


8

Para mí funcionó sin el signo igual como este:

location /old-url {
  return 301 /new-url;
}

2
No necesita el bloque de ubicación en absoluto. Solo úsalo rewrite. Ver la respuesta de @ SteveEdison.
PKHunter
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.