reescrita nginx acrescenta um parâmetro no final de um URL

13

Preciso configurar meu proxy reverso para que o seguinte parâmetro seja adicionado no final do URL: &locale=de-de

Isso quase funciona:

rewrite ^(.*)$ $1&locale=de-de break;

No entanto, o problema é que eu preciso anexar '& locale = de-de' apenas se ele ainda não estiver lá e se houver um '?' no URL ...

Posso obter ajuda para formular a regex correta para fazer isso?

Outra pergunta: por que o ponto de interrogação no meu URL não é mostrado se eu uso:
$ uri? $ Args

Ou $ uri $ is_args $ args traduz o URL não codificado e o ponto de interrogação é exibido como% 3f.

Ideias?

EDIT: Parece que esse comportamento existe ao usar em combinação com proxy_pass. Em uma simples reescrita, funciona muito bem.

Sascha
fonte

Respostas:

15
  1. Em rewritevocê corresponde apenas à parte do caminho do URL . Que significa,$1 que não conterá a string de consulta.
  2. Por padrão, o Nginx anexa a string de consulta original à substituição de reescrita.

Portanto, deve ser seguro escrever

rewrite ^(.*)$ $1?locale=de-de break;

Caso você não queira que o Nginx acrescente a string de consulta original, basta especificar ?no final da URL de substituição:

rewrite ^(.*)$ $1?locale=de-de? break;
Alexander Azarov
fonte
Obrigado! Não vi que tentei fazer da maneira errada.
Sascha
A + é a melhor resposta
Obrigado
3

A correspondência para rewritenão inclui os parâmetros de consulta, portanto, você deve testá-la em outro lugar.

Experimentar:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}
Shane Madden
fonte
1
"IfIsEvil": wiki.nginx.org/IfIsEvil
Alexander Azarov
@Alexander Bom ponto; isso rewriteprecisa lastser seguro. Editado.
Shane Madden
3

o rewrite não modifica os parâmetros de solicitação, apenas a parte do caminho do URI. Na minha experiência, mexer nas reescritas leva a ciclos estranhos, nos quais o novo parâmetro é acrescentado ad infinitum. Reescrever provavelmente não é a maneira de fazer isso no Nginx.

Em vez disso, você deve modificar a $argsvariável usando a setdiretiva:

set $args $args&locale=de-de;
Palimondo
fonte
Eu discordo que $argsdeve ser modificado. Em vez disso, consulte a solução de @ AlexanderAzarov.
Obrigado