location匹配的原型是这样的:location [=|~|~*|^~|@] /uri/ { … }
“=”是精确匹配
“@”是命名的location,在正常的location匹配中不会使用,仅仅在内部跳转中才会使用到。
“~”是区分大小写的匹配
“~*”是不区分大小写的匹配
“^~”表示中止正则匹配(这个平时没太注意)
在一个请求中,匹配的顺序是这样的。先使用所有location来匹配URI的开始部分,最精确匹配的(形象点说,就是即配置字符数最多的)为最后匹配结果;然后进行正则表达式的匹配,按照配置文件中的顺序来进行匹配,如果有一个匹配成功,则结束正则匹配,且最后匹配结果为此location,否则,最后结果为先前最精确匹配的的那个location。
之前有提到过”^~”,它配置在非正则匹配中,表示,如果最精确匹配的loction为此location,则立即返回该location作为结果,而不进行下一步的正则匹配,这样,就此可以不必要进入到正则匹配当中,以加快匹配速度。
还有”=”,它是最精确的匹配,而且优先级最高。最先进行带”=”的匹配,如果匹配成功,立马返回。
最后总结下匹配的过程,有四步:
1. 带”=”前缀的先进行匹配,如果找到了,中止查找。
2. 所有其它location进行非正则的匹配,找到最精确匹配的那个,如果匹配到带”^~”前缀的,则中止查找。
3. 正则查找,按照我们配置文件中配置的location顺序进行查找。
4. 如果正则查找匹配成功,则使用此正则匹配的location,否则,使用第二步查找的结果。
这里要特别说明下”=”与”^~”的区别:
“=”在匹配时,则匹配带”=”的location。而”^~”,则会匹配所有非”=”的非正则location,只有在确认它是最精确匹配的location后,才生效。
>>原创文章,欢迎转载。转载请注明:转载自 程序非主流,谢谢!
>>原文链接地址: Nginx中的location匹配的几点说明