![如何为nginx发送的每个html设置特定的键值对,而不丢失其他键值对?](https://linux22.com/image/673078/%E5%A6%82%E4%BD%95%E4%B8%BAnginx%E5%8F%91%E9%80%81%E7%9A%84%E6%AF%8F%E4%B8%AAhtml%E8%AE%BE%E7%BD%AE%E7%89%B9%E5%AE%9A%E7%9A%84%E9%94%AE%E5%80%BC%E5%AF%B9%EF%BC%8C%E8%80%8C%E4%B8%8D%E4%B8%A2%E5%A4%B1%E5%85%B6%E4%BB%96%E9%94%AE%E5%80%BC%E5%AF%B9%EF%BC%9F.png)
我想使用 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;
}