在 nginx server 模块中,location 的定义长被用来匹配一个标准的 URI, 并根据 URI 的不同做出相应的服务方案。
在 location 中,共有 5 种匹配的模式:
种类 | 写法 |
---|---|
none | location 中没有指定任何的匹配模式, 会以前缀的方式进行匹配,不会停止搜索,会继续匹配下一个 location 的内容。 |
= |
location 中需要准确匹配 = 后面配置的内容,如果匹配成功,就停止搜索。 |
~ |
会以大小写敏感的方式来匹配 location 中的内容。 |
~* |
会以大小写不敏感的方式来匹配 location 中的内容。 |
^~ |
如果以非正则的方式,找到了最佳的匹配内容,会停止到这,不再搜索可能存在的正则匹配 。 |
在看完这五种默认的匹配后,可能还是觉得不太容易理解, 下面会以 Nginx 的视角来模拟匹配的过程。
对于每一个请求来说,Nginx 会在配置的多个 location 块中,选取最合适的一个配置块来提供客户端的响应。而为了找到最优的选择,在每一个请求来时,会执行如下的流程:
=
后配置相同的内容,就会立即选择这个 location 的配置作为请求的服务端。=
开始的 location 块,Nginx 会开始搜索能够匹配前缀的 location 配置块,并选择匹配最长前缀的 location 进行判断:
^~
,Nginx 就会停止搜索,选择这个 location 提供服务。^~
, 也就是 none 的类型,Nginx 会将当前作为临时的参考,继续向下搜索。简单来说,匹配的优先级就是:=
> ^~
> ~
> ~*
> none
假设对 Nginx location 进行了如下的配置:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
/
会匹配到 configuration A ,因为 =
是搜索的第一位,也具有最高的优先级。
/images/1.gif
会匹配到 configuration D 。
首先 =
代表的配置块没有匹配成功,会开始进行前缀最长匹配,这时发现 D 满足,且 D 是 ^~
类型,进而选择 D 。
/documents/1.jpg
会匹配到 configuration E 。
同样 =
代表的配置块没有匹配成功,会开始进行最长前缀匹配,这时发现 E 满足,但 E 并不是 ^~
类型,因此作为临时方案,继续向下匹配。发现 E 是正则匹配,且能匹配成功,就此结束选择 E 。
/index.html
会匹配到 configuration B 的配置块。
一样的 =
代表的配置块匹配失败,会开始进行最长前缀匹配,这时发现 B 满足,但 B 并不是 ^~
类型,临时保存,继续匹配。发现并不能找到合适的正则匹配。因此托底方案 B 被选择。
原文:https://www.cnblogs.com/michael9/p/11857502.html