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.

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.