reescrita do nginx para um URL com parâmetros

16

Eu tenho um URL deste tipo:

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

E eu quero redirecioná-lo para este:

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

Então, eu tentei essa regra de reescrita sem sucesso:

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

O nginx não pode lidar com parâmetros de consulta?

EDIT: Não quero reescrever todas as petições. Eu só preciso reescrever esse URL, sem afetar os outros.

David Morales
fonte

Respostas:

15

Ok, graças à ajuda inicial do rzab, redefini sua regra para esta solução de trabalho:

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

Acabei de adicionar uma condição para evitar recursões infinitas, e a? no final da regra para se livrar dos parâmetros iniciais . Funciona perfeitamente :)

David Morales
fonte
11
A string de consulta permite uma ordem diferente de parâmetros. Portanto, o seu ifirá parar de funcionar quando, por exemplo, param2for anterior param1.
Alexander Azarov
Interessante. No meu caso, isso não ocorrerá porque é um URL clicável em um email, mas é bom saber. Obrigado.
David Morales
4
location = / {
  reescrever ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}
rzab
fonte
Então, devo escrever $ arg_ e, em seguida, o nome do parâmetro?
David Morales
Sim, isso seria o mais fácil.
Martin Fjordvald 15/07
Ok, mas não quero reescrever todas as petições. Eu só preciso reescrever esse URL, sem afetar os outros.
David Morales
Eu fiz alguns testes. Essa regra irá gerar um redirecionamento infinito. Escreverei uma nova resposta com o código que cheguei ao trabalho. Obrigado :)
David Morales
Eu provavelmente devo mencionar que você deve declarar "location /" além de "location = /" para evitar recursão. Eu acho que você terá que proxy_pass em algum lugar como a rota principal. "location = /" corresponde exatamente a / solicitações. De qualquer forma, combinando $ args parece ok, exceto que ele vai corresponder qualquer pedido com os parâmetros param1 = val1 & ....?
rzab