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.

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


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;
}

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
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.