Nginx location执行顺序和匹配规则

nginx location执行顺序和匹配原则根据location的特点分为普通和正则两种,执行顺序和匹配规则的差异也在于此。

执行顺序

nginx会优先执行普通location,不管普通location是否匹配,都会再次转向执行正则location,一旦第一个正则location被满足,则停止向后执行。

匹配原则

正则location的匹配优先级更高,会覆盖掉已匹配的普通location。

正则location之间的优先级取决于执行顺序,一旦前一个匹配,则停止向后搜索。

普通location之间使用最大前缀匹配原则。

普通location使用严格精确匹配时,一旦匹配,将不再执行后续正则location。

普通location

location /a {}

无任何前缀的普通location。

正则location

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

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

location ~ \.html {}

location执行顺序示例说明

优先匹配普通location,不管普通location是否匹配,都会再次转向正则location,直到遇上第一个满足条件的正则location。

location /a.js {
  	    root   /var/3w/static/;
  	  expires  3h;
}

location ~ .*\.(js|xml|xsl|css|woff2|woff|ttf|json|ico|woff2|png|jpg|gif)$ {
  	  root   /var/www/static/;
  	  expires  3h;
}

普通location匹配后若不需要转向正则location,可在普通location前加上^~,明确告知nginx,此location匹配时,就停止对后续正则的搜索。

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

阻止正则location继续搜索,有两组符号:

^~
=

区别在于前者是最大前缀匹配,后者是严格匹配。

普通location使用严格精确匹配时,会终止对后续正则location的搜索。

普通location匹配原则

多个普通location之间,使用最大前缀匹配

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

示例中,假设请求url是http://xieyonghui.com/a/b/index.html,最终会匹配上location /a/b/{}。

正则location间匹配原则

多个正则location间,由location顺序决定,直到遇上第一个被满足的正则location

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

 示例中会匹配上第一个。