Nginx: Redirigir URL para incluir siempre un prefijo local

Nginx: Redirigir URL para incluir siempre un prefijo local

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 locationdirectiva:

location /en/ {
   try_files $uri $uri/ =404;
}

location / {
   return 301 /en$uri;
}

información relacionada