修复nginx中的重复查询字符串

时间:2014-02-28 16:52:37

标签: nginx

我有一个奇怪的例子,我的应用程序现在由于某种原因将重复的查询字符串附加到已经有一个的URL上。我现在没有访问或时间深入了解应用程序代码,但我确实可以访问Nginx配置。

我需要的是一个重写规则,它将忽略重复的查询字符串,即

http://foo.com?test=bar?test=bar会重定向到http://foo.com?test=bar

这甚至可能吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在此处,在server块中添加此内容,然后在任何其他locationif之前添加:

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重写标志。