匹配查询字符串时,nginx正则表达式的行为不符合预期

时间:2015-03-24 12:28:49

标签: regex nginx rewrite

我有一个位于我网站前面的nginx服务器。它用于将公共页面请求直接引导到清漆缓存和任何其他请求直接到HA代理。对于公共部分,我使用301重定向添加尾部斜杠用于SEO目的。

这是我的位置栏:

location ~* ^((?!api|dashio|socket.io|pagespeed)[^.\?])*[^/]$ {
    return 301 $scheme://$host$request_uri/;
}

1)(?!api|dashio|socket.io|pagespeed) 如果找到任何指定的字符串,则此部分为负前瞻,不匹配。

2)(...[^.\?])* 此部分捕获不是.?

的任何字符

3)[^/]$ 最后,此部分匹配任何不以斜杠结尾的字符串

所有这些都应匹配任何不包含apidashiosocket.iopagespeed.或{{1}的网址}}。奇怪的是,除了从?部分到不破坏查询字符串之外,一切都很完美。

当我将正则表达式放入http://www.regexr.com/并对?进行检查时,它正确地与字符串不匹配,但Nginx仍然匹配它。

如果有人有任何想法,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

请参阅https://serverfault.com/questions/237517/nginx-query-keyword-matching-in-location

  

这是不可能的,因为位置只会与URI匹配   没有查询参数。您需要在该位置内使用if   以及http://wiki.nginx.org/HttpCoreModule#.24arg_PARAMETER

     

if($ is_args)   {       打破;   }