Como definir um par de valores-chave para cada html enviado pelo nginx sem perder outros pares de valores-chave?

1

Eu quero definir o valor de mode na string de pesquisa de cada html usando nginx. Eu escrevi códigos assim:

 if ( $arg_mode !~ test ){
     rewrite ^(?:/(.*)\.html)?$ /$1.html?mode=test? redirect;
 }

Mas isso causará a perda de outros pares de valores-chave.

Por exemplo, se eu solicitar o URL

http://xxx.xx.xx/weather/bug.html?code=12345&mode=mess

Eu queria receber

http://xxx.xx.xx/weather/bug.html?code=12345&mode=test

mas eu recebo

http://xxx.xx.xx/weather/bug.html?mode=test

em vez disso.

O código do par de valores-chave = 12345 é perdido.

Como posso corrigir isso?

    
por Yan Yang 15.12.2015 / 16:14

1 resposta

0

Você pode executar a regex em toda a string $args e extrair os termos na frente e atrás do parâmetro mode . Eu usei capturas nomeadas para que elas ainda sejam válidas dentro da diretiva rewrite . E eu não usei agrupamentos que não capturam para maior clareza.

if ($args ~ ^(?<front>.*&)?mode=(?!test)([^&]*)(?<back>&.*)?$ ) {
    rewrite ^ $uri?${front}mode=test${back}? last;
}

Observação: use redirect ou permanent em vez de last para obter um redirecionamento externo.

Isso praticamente faz o que você quer. Evita um loop de redirecionamento usando uma asserção direta negativa mode=test .

A outra alternativa é usar a diretiva if dentro do bloco location que processa a solicitação, caso em que um break pode ser usado, o que também evita um loop de redirecionamento. Tais como:

if ($args ~ ^(?<front>.*&)?mode=([^&]*)(?<back>&.*)?$ ) {
    rewrite ^ $uri?${front}mode=test${back}? break;
}
    
por 15.12.2015 / 17:34

Tags