nginx location匹配/优先顺序

关于nginx location的匹配顺序,我想也不需要我多说了,不过是结论还是研究过程,网络上都有相当多的文章,随便百度、Google都能找到。

简单点说,分别有=、^~、~、~*、!~、!~*、无前缀等几种,按优先级排列就是= > ^~ > ~/~*/!~/!~* > 无前缀。

=是完整匹配,^~是前缀匹配,~/~*是正则匹配;当这几种匹配都失败时,会再去匹配长度最长的无前缀规则。

~与~*的区别~*大小写无关的,~与!~的区别是!~是~的反义,~*与!~*的区别同理;

正则按照文档中出现的顺序测试,第一个测试成功后后面就不再测试了;

~/~*/!~/!~*这几个正则规则的优先顺序未测,估计也是按文档中出现的顺序测试。

^~是不支持任何正则规则的(不要被^后面的~误导了^_^)。

location匹配以后,除非内部重新计算location,否则是只有一个能生效的。

需要注意的是,^~是个魔鬼,进入这个location后,仿佛内部会自动应用rewrite的break一样,任何脚本都会无效。

举例说,有下面的配置文档:

location ~ \.php$ {
    # php cgi
}

location ^~ /test/ {
    # rules
}

这个时候,访问/index.php是正常的,/test/index.html也是正常的,但访问/test/index.php时,会变成下载该php文件,也就是说第一个location已经失效了!

所以^~最好只用来处理该前缀只有静态资源的情况,任何需要cgi的地方一旦用了它,那就只能瞪眼了。

此条目发表在原创空间, 技术随笔分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论