nginx的location匹配顺序

总原则:先前缀字符串,再正则表达式。

不管配置文件中的location顺序怎么写,在匹配时,都会先将所有前缀字符串拎出来,放在第一位;然后再去找所有正则表达式,作为第二位。

1、首先匹配前缀字符串。前缀字符串有以下几种形式(举例):

a、location = /data/ {}

b、location ^~ /data/ {}

c、location /data/ {}

 

2、然后匹配正则表达式。正则表达式的几种形式(举例):

d、location ~ \.html? {}

e、location ~* \.html? {}

 

a的权限最大,一旦匹配到,立即停止,直接使用对应的location。

b的权限次之,一旦匹配到,就不再检查正则表达式。相当于打断了后续。

 

c如果匹配到了,不会立即停止,而是会先将它存储起来,然后继续往下匹配。

 

d如果匹配到了,立即停止,直接使用对应的location;

d如果没有匹配,继续往下找。

 

e如果匹配到了,立即停止,直接使用对应的location;

e如果没有匹配,就使用先前存储的那个前缀字符串。

 

也就是说,location /data/ {}这种模式是等级最低的。实在匹配不到了,才勉强使用它。

 

前提是我们配置了a、b、c、d、e这五个location。

如果只配置了a、b、c,就没有正则匹配什么事了;

如果只配置了d、e,就没有前缀匹配什么事了。

 

那么什么叫最长匹配呢?

一个请求为:http://www.example.com/images/a.png

对于/images/a.png这个URI来说,上面的2个location中,location /images/是最长匹配。虽然location /也能匹配,但不是最长的。

由于不是精确匹配,nginx此时会先将这个最长匹配保存起来

 

如果后面配置了正则表达式,那么nginx会继续向下匹配正则表达式。

如果后面没有配置正则表达式,nginx就会使用刚才保存的最长的那个前缀匹配,也就是location /images/对应的地方。

posted @ 2020-06-06 16:54  道霖  阅读(809)  评论(0编辑  收藏  举报