Nginx location匹配顺序

Nginx location分为普通和正则两种,匹配规则的微妙差异就在于此。

普通location

location /a {}

无任何前缀的location。

正则location

location [=|~|~*|^~|@] /uri/ { … } 

location ~ \.html {}

“~ ”表示区分大小写,“~* ”则不区分大小写。

location匹配规则

优先匹配普通location,不管普通location是否匹配,都会再转向正则location,一旦正则location条件满足,则会覆盖普通location。

若想普通location匹配后,不再转向正则location,可在普通location前加上^~,以明确告知:若该location匹配,则不对后续正则做匹配搜索。

location ^~ /images/ {}
location ~* \.(gif|jpg)$ {}

阻止正则location继续搜索,有两组符号可用,^~和=,二区别在于:前者是最大前缀匹配,后者是严格匹配。

若请求路径与普通location严格精确匹配,也会终止对后续正则location的搜索。

普通location间的匹配规则

多个普通location之间,选择最大前缀匹配:

location /a/ {}
location /a/b/ {}

针对示例中的location,请求url若为http://xieyonghui.com/a/b/index.html,则匹配location /a/b/{}。

正则location间的匹配规则

多个正则location间,由location顺序决定,一旦前一个匹配,就会停止向后搜索。

location ~* {}
location ~ \.html {}