关于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的地方一旦用了它,那就只能瞪眼了。