nginx重写在网址末尾附加参数


13

我需要配置反向代理,以便在URL的末尾添加以下参数: &locale=de-de

这几乎可以工作:

rewrite ^(.*)$ $1&locale=de-de break;

但是,问题是,仅当 '&locale = de-de' 还不存在并且存在'?'时,需要附加它 在网址中...

我可以在制定正确的正则表达式方面获得一些帮助吗?

另一个问题:如果使用以下命令,为什么我的URL中的问号没有显示:
$ uri?$ args

或者$ uri $ is_args $ args转换未编码的url,问号显示为%3f。

有想法吗?

编辑:与proxy_pass结合使用时,似乎存在此行为。通过简单的重写,它确实可以很好地工作。

Answers:


15
  1. rewrite您只匹配URL的路径部分。这意味着,$1将不包含查询字符串。
  2. 默认情况下,Nginx将原始查询字符串附加到重写替换项之后。

所以,写起来应该很安全

rewrite ^(.*)$ $1?locale=de-de break;

如果您不希望Nginx追加原始查询字符串,只需?在替换URL的末尾指定即可:

rewrite ^(.*)$ $1?locale=de-de? break;

谢谢!我没有看到我尝试以错误的方式进行操作。
Sascha

A +,这是最好的答案
谢谢您

3

的匹配项rewrite不包括查询参数,因此您需要在其他地方进行测试。

尝试:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}

1
“ IfIsEvil”:wiki.nginx.org/IfIsEvil
Alexander

@亚历山大好点; 这rewrite需要一个last地方,如果安全。编辑。
Shane Madden

3

rewrite不修改请求参数,仅URI的路径部分。以我的经验,搞乱重写会导致怪异的循环,新的参数会无限次地附加到新参数上。在Nginx中,重写可能不是这样做的方法。

相反,您应该$args使用set指令修改变量:

set $args $args&locale=de-de;

我不同意$args应该改变。相反,请参阅@AlexanderAzarov的解决方案。
谢谢您
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.