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.