nginx rewrite agrega un parámetro al final de una url

13

Necesito configurar mi proxy inverso para que se agregue el siguiente parámetro al final de la url: &locale=de-de

Esto casi funciona:

rewrite ^(.*)$ $1&locale=de-de break;

Sin embargo, el problema es que necesito agregar '& locale = de-de' solo si aún no está allí y si hay un '?' en la url ...

¿Puedo obtener ayuda para formular la expresión regular correcta para hacer esto?

Otra pregunta: ¿Por qué no se muestra el signo de interrogación en mi url si uso esto:
$ uri? $ Args

O $ uri $ is_args $ args traduce la url no codificada y el signo de interrogación se muestra como% 3f.

Ideas?

EDITAR: Parece que este comportamiento existe mientras se usa en combinación con proxy_pass. En una simple reescritura, funciona muy bien.

Sascha
fuente

Respuestas:

15
  1. En rewriteusted coincide solo con la parte de la ruta de la URL . Lo que significa $1que no contendrá la cadena de consulta.
  2. De forma predeterminada, Nginx agrega la cadena de consulta original al reemplazo de reescritura.

Por lo tanto, debería ser seguro escribir

rewrite ^(.*)$ $1?locale=de-de break;

En el caso de que no desee que Nginx agregue la cadena de consulta original, simplemente especifique ?al final de la URL de reemplazo:

rewrite ^(.*)$ $1?locale=de-de? break;
Alexander Azarov
fuente
¡Gracias! No vi que intenté hacerlo de la manera incorrecta.
Sascha
A + esta es la mejor respuesta
Gracias
3

La coincidencia para rewriteno incluye los parámetros de consulta, por lo que debe probarlo en otro lugar.

Tratar:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
fuente
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Alexander Azarov
@Alexander Buen punto; eso rewritenecesita un lastpara ser seguro. Editado
Shane Madden
3

El rewriteno modifica los parámetros de solicitud, solo la porción de ruta del URI. En mi experiencia, jugar con las reescrituras conduce a ciclos extraños, donde el nuevo parámetro se agrega hasta el infinito. Reescribir probablemente no sea la forma de hacer esto en Nginx.

En su lugar, debe modificar la $argsvariable utilizando la setdirectiva:

set $args $args&locale=de-de;
Palimondo
fuente
No estoy de acuerdo con que $argsdeba mutarse. En cambio, vea la solución de @AlexanderAzarov.
Gracias