如何为nginx发送的每个html设置特定的键值对,而不会损失其他键值对?

我想使用nginx在每个html的searchstring中设置mode的值。 我写这样的代码:

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

但是会造成其他键值对的丢失。

例如,如果我请求的url

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

我打算得到

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

但是我明白了

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

代替。

键值对代码= 12345丢失。

我怎样才能解决这个问题?

你可以运行整个$argsstring的正则expression式,并提取mode参数前后的条件。 我已经使用了命名捕捉,以便它们在rewrite指令中仍然有效。 为了清晰起见,我还没有使用非捕获组合。

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

注意:使用redirectpermanent而不是last来实现外部redirect。

这几乎是你想要的。 它通过使用负向前断言mode=test来避免redirect循环。

另一种方法是在处理请求的location块中使用if指令,在这种情况下可以使用break ,这也可以避免redirect循环。 如:

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