我想使用 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;
}
注意:使用redirect
或permanent
代替 来last
实现外部重定向。
这基本上就是你想要的。它通过使用否定前向断言来避免重定向循环mode=test
。
另一种选择是在处理请求的块if
中使用指令,在这种情况下可以使用,这也可以避免重定向循环。例如:location
break
if ($args ~ ^(?<front>.*&)?mode=([^&]*)(?<back>&.*)?$ ) {
rewrite ^ $uri?${front}mode=test${back}? break;
}