在我的一个位置规则中,我试图重写URL:
rewrite ^ $topicredirecturi?$args permanent;
$topicredirecturi
在地图文件中计算,映射例如
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
任何人都知道这里会发生什么?
答案 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:
如果指示了替换参数行,则将其余的请求参数附加到它们。为避免附加它们,请将问号作为最后一个字符: