在nginx重写中使用$ args导致重复的URL参数

时间:2014-05-13 15:15:55

标签: nginx rewrite query-string

在我的一个位置规则中,我试图重写URL:

rewrite ^ $topicredirecturi?$args permanent;

$topicredirecturi在地图文件中计算,映射例如

等URL
http://www.topics.com/companies/cit-group-inc/index.html

http://www.topics.com/companies/cit_group_inc/index.html

当我使用以下网址参数发出请求时:

http://www.topics.com/companies/cit-group-inc/index.html?rss=1

我得到以下重写的URL,包含重复的参数:

http://www.topics.com/companies/cit_group_inc/index.html?rss=1&rss=1

同样,网址

http://www.topics.com/companies/cit-group-inc/index.html?rss=1&bob=2

被重写为

http://www.topics.com/companies/cit_group_inc/index.html?rss=1&bob=2&rss=1&bob=2

任何人都知道这里会发生什么?

2 个答案:

答案 0 :(得分:6)

@Yirkha答案错了。 Nginx不会自动附加查询字符串总是,但如果重写的URL中有其他get参数,则 。如果您自己添加$args,则应在重写的网址末尾添加?(问号)以避免重复参数。

使用查询字符串进行重定向的正确方法是:

rewrite ^(...)$ /destination$is_args$args? [permanent|redirect];

其中$is_args包含? iff查询字符串不为空,$args是查询字符串本身;最后的问号请求nginx不再添加查询字符串。

答案 1 :(得分:5)

使用rewrite时,会自动附加查询字符串。所以只需删除?$args部分。

来自http://wiki.nginx.org/HttpRewriteModule

  

如果指示了替换参数行,则将其余的请求参数附加到它们。为避免附加它们,请将问号作为最后一个字符: