nginx reescribe para una url con parámetros

16

Tengo una URL de este tipo:

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

Y quiero redirigirlo a este:

http://www.example.com/newparam/val3/val4

Así que probé esta regla de reescritura sin éxito:

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

¿Nginx no puede manejar los parámetros de consulta?

EDITAR: No quiero reescribir todas las peticiones. Solo necesito reescribir esa URL, sin afectar a las demás.

David Morales
fuente

Respuestas:

15

Ok, gracias a la ayuda inicial de rzab, he redefinido su regla para esta solución de trabajo:

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

Acabo de agregar una condición para evitar una recursión infinita, y un? al final de la regla para deshacerse de los parámetros iniciales . Funciona perfectamente :)

David Morales
fuente
1
La cadena de consulta permite un orden diferente de parámetros. Por lo tanto if, dejará de funcionar, por ejemplo, param2antes param1.
Alexander Azarov
Interesante. En mi caso, no ocurrirá porque es una URL en la que se puede hacer clic en un correo electrónico, pero es bueno saberlo. Gracias.
David Morales
4
ubicación = / {
  reescribir ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
fuente
Entonces, ¿debo escribir $ arg_ y luego el nombre del parámetro?
David Morales
Sí, eso sería lo más fácil.
Martin Fjordvald
Ok, pero no quiero reescribir todas las peticiones. Solo necesito reescribir esa URL, sin afectar a las demás.
David Morales
He hecho algunas pruebas. Esa regla generará una redirección infinita. Escribiré una nueva respuesta con el código que tengo para trabajar. Gracias :)
David Morales
Probablemente debería mencionar que debe declarar "ubicación /" además de "ubicación = /" para evitar la recurrencia. Supongo que lo tendrás que pasar a proxy_pass en algún lugar como la ruta principal. "location = /" coincide exactamente con / request. De todos modos, a juego args $ parece que está bien, excepto que igualaremos cualquier solicitud con los parámetros param1 = val1 y ....?
rzab