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