我有一个奇怪的例子,我的应用程序现在由于某种原因将重复的查询字符串附加到已经有一个的URL上。我现在没有访问或时间深入了解应用程序代码,但我确实可以访问Nginx配置。
我需要的是一个重写规则,它将忽略重复的查询字符串,即
http://foo.com?test=bar?test=bar
会重定向到http://foo.com?test=bar
这甚至可能吗?谢谢。
答案 0 :(得分:0)
在此处,在server
块中添加此内容,然后在任何其他location
或if
之前添加:
if ($query_string ~ ^([^?]+)\?\1$) {
set $clean $1;
rewrite . $uri?$clean?;
}
要做到正确是非常棘手的,因为有不止一些模糊不清的行为:
$query_string
是没有初始?
\1
与第一个组的第二个副本(...)
匹配$1
保存到新变量中,因为重写会覆盖它$uri
而不是$request_uri
,因为后者包含原始查询字符串的副本?
,否则重写会附加原始查询字符串的副本! (这可能是Nginx语法中最模糊的一点) rewrite
(没有redirect
标志)的简单形式对于大多数应用程序应该足够了,而且它不需要额外的浏览器往返。
如果它不适合您,您可以尝试将$clean
查询字符串用于相应的后端指令(例如fastcgi_param QUERY_STRING
等),或作为最后的手段,发出浏览器重定向使用redirect
重写标志。