Estoy tratando de lograr algo con nginx y reglas de redireccionamiento que parece que debería ser bastante sencillo, pero me encontré con un obstáculo.
Después de revisar muchas preguntas y respuestas, parece que no puedo encontrar una solución que funcione para mí.
Lo que quiero lograr es lo siguiente:
Si alguien navega a mi sitio web con cualquiera de las siguientes URL:
http://mywebsite.com
http://mywebsite.com/
http://mywebsite.com/foo
la persona será redirigida a:
http://mywebsite.com/en/
http://mywebsite.com/en/
http://mywebsite.com/en/foo/
Esto es lo que tengo en mi archivo de configuración de nginx hasta ahora en el orden en que los tengo en el archivo:
location ^/en/(.*) {
try_files $uri /index.php$is_args$args last;
}
location / {
if ( $uri !~ ^/(index\.php|css|jpg|png|images|core|uploads|js|robots\.txt|favicon\.ico) ) {
return 301 /en/$uri;
}
}
Sin embargo, con la configuración anterior, me encuentro con un bucle de redireccionamiento infinito y la URL en la barra de direcciones termina así antes de que el servidor se dé por vencido:
http://mywebsite.com/en//en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/en/
¿Alguien puede por favor?
a) Explícame por qué mi configuración no ha tenido el efecto deseado para poder entenderlo y no repetir los mismos errores en el futuro.
b) Proponer una solución que funcione y si es posible mejorar mi configuración.
c) Si es posible, vaya más allá y explique con ejemplos cómo puedo hacer que nginx determine automáticamente la configuración regional asociada con la solicitud y transforme dinámicamente la solicitud para incluirla de la manera descrita anteriormente.
Gracias
Respuesta1
Explícame por qué mi configuración no ha tenido el efecto deseado para poder entenderlo y no repetir los mismos errores en el futuro.
location ^/en/(.*)
no es una directiva válida.
Es posible que te hayan confundido con location ^~ /en/(.*)
. Esto coincide con cualquier consulta que comience con /en/
seguida de cualquier cosa.
En realidad, la solicitud siempre coincide con la location /
directiva para que lo lleve a un bucle infinito.
Proponer una solución que funcione y si es posible mejorar mi configuración.
Simplemente use el prefijo Path dentro de la location
directiva:
location /en/ {
try_files $uri $uri/ =404;
}
location / {
return 301 /en$uri;
}