我有一个位于我网站前面的nginx服务器。它用于将公共页面请求直接引导到清漆缓存和任何其他请求直接到HA代理。对于公共部分,我使用301重定向添加尾部斜杠用于SEO目的。
这是我的位置栏:
location ~* ^((?!api|dashio|socket.io|pagespeed)[^.\?])*[^/]$ {
return 301 $scheme://$host$request_uri/;
}
1)(?!api|dashio|socket.io|pagespeed)
如果找到任何指定的字符串,则此部分为负前瞻,不匹配。
2)(...[^.\?])*
此部分捕获不是.
或?
3)[^/]$
最后,此部分匹配任何不以斜杠结尾的字符串
所有这些都应匹配任何不包含api
,dashio
,socket.io
,pagespeed
,.
或{{1}的网址}}。奇怪的是,除了从?
部分到不破坏查询字符串之外,一切都很完美。
当我将正则表达式放入http://www.regexr.com/并对?
进行检查时,它正确地与字符串不匹配,但Nginx仍然匹配它。
如果有人有任何想法,我们将不胜感激。
答案 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) { 打破; }