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