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.