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

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

我想使用 nginx 在每个 html 的搜索字符串中设置的值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

反而。

键值对code=12345丢失。

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

答案1

您可以在整个$args字符串上运行正则表达式并提取参数前后的术语mode。我使用了命名捕获,以便它们在rewrite指令中仍然有效。为了清晰起见,我没有使用非捕获分组。

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

注意:使用redirectpermanent代替 来last实现外部重定向。

这基本上就是你想要的。它通过使用否定前向断言来避免重定向循环mode=test

另一种选择是在处理请求的块if中使用指令,在这种情况下可以使用,这也可以避免重定向循环。例如:locationbreak

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

相关内容