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