nginx location优先级详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16414307/article/details/51364996

nginx中location有几种:

1.前缀,可以有=或^~修饰,比如

location  /       /开头的

location /img/     /img/开头的

location = /a.htm      刚好/a.htm

location ^~ /d    匹配后不再检查正则表达式location。注意这个意思不是非正则表达式!除了~开头其他都是非正则表达式,也就是前缀匹配


2.正则表达式,固定~或~*(不区分大小写)开头,比如:

location ~  \.html$

location ~*  \.gif$



同时有多个location时,优先级如下:

1.Test the URI against all prefix strings.

和所有前缀比较


2.The = (equals sign) modifier defines an exact match of the URI and a prefix string. If the exact match is found, the search stops.
某个匹配前缀有=,则结束匹配


3.If the ^~ (caret-tilde) modifier prepends the longest matching prefix string, the regular expressions are not checked.
最长匹配的有 ^~ 则结束匹配


4.Store the longest matching prefix string.
保存最长匹配


5.Test the URI against regular expressions.
再检查 ~开头的正则表达式


6.Break on the first matching regular expression and use the corresponding location.
第一个匹配的正则表达式,结束匹配


7.If no regular expression matches, use the location corresponding to the stored prefix string.

没有正则匹配,则使用刚才最长前缀



所以,nginx的location中,~开头的正则表达式配置顺序会影响效果,而非~开头的前缀匹配则和配置顺序完全无关。

建议按如下顺叙写配置文件:


# =开头的精确前缀匹配优先最高

location = /a.html{}


#  ^~开头的,禁止再匹配正则的前缀匹配

location ^~  /img{}

#但是这里注意 ,如果后面有 location /img/abc{},且能匹配,那么上面这条无法匹配

#所以建议一旦一个前缀以^~开头,则其下的前缀配置也都用^~


# 正则表达式,注意这部分需要考虑配置顺序

location ~  \.*.htm$ {}    #/a/b.htm匹配这个而不是下面的,仅仅因为这行在前

location ~  ^\/a {}


# 其他非 ^~ 与=开头的前缀匹配,虽然顺序无关,但建议把长的放前面

location  /abc/df {}


#最后匹配的

location  / {}


这样检查配置时,从上往下,匹配了,就不用看后面的了










猜你喜欢

转载自blog.csdn.net/qq_16414307/article/details/51364996
今日推荐