详细解析 nginx uri 如何匹配 location 规则
location 是 nginx 配置中出现最频繁的配置项,一个 uri 是如何与多个 location 进行匹配的?
在有多个 location 都匹配的情况下,如何决定使用哪一个 location 作为匹配结果?
清晰内部机制之后,疑问自然迎刃而解。
location 规则类型
根据官方文档,location 配置语法如下
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
其语法对应了 location 规则的 5 种类型:
prefix
前缀匹配规则,假如 uri 包含相应的前缀,则匹配成功。
语法上, location 之后单纯跟上 uri,没有任何操作符。
location /api/v1 {
....
}
exact uri
完全匹配规则,假如 uri 和规则完全相同,则匹配成功。
语法上,使用 = 操作符。
location = /api/v1 {
....
}
case-sensitive regex
区分大小写的正则表达式匹配规则,假如 uri 与正则表达式相匹配,则匹配成功。
正则表达式使用 pcre library,语法和 perl 兼容。
语法上,使用 ~ 操作符。
这里有一个细节,uri 作为一个 string,只需 regex 匹配其中的一部分,就可算作匹配。
比方有如下的规则,
location ~ /api/v1 {
....
}
可以匹配 uri
- /api/v1/login
- /pod/api/v1
假如想要匹配整个 string,则要使用 ^ $。
比方,
location ~ ^/api/v1.*$ {
....
}
可以匹配 uri
- /api/v1/login
不可以匹配
- /pod/api/v1
case-insensitive regex
规则同上,区别只在于,正则表达式不区分大小写。
不区分大小写的正则表达式匹配规则,假如 uri 与正则表达式相匹配,则匹配成功。
语法上,使用 ~* 操作符。
location ~* /api/v1 {
....
}
disable regex prefix
匹配流程与 prefix 规则相同,有一点区别在于,假如最长匹配是当前规则,则之后不进行 正则表达式 规则的搜索。
这一点可能有些难以了解,后面会详细讲解。
语法上,使用 ^~ 操作符。
location ^~ /api/v1 {
....
}
uri 如何选择 location
前面讲到,location 规则有 5 种类型,那么 uri 如何在多种不同类型的 location 规则之间,
最终选择到唯一的 location 规则呢?
根据官方文档的形容,详细规则如下:
- 假如存在 exact uri 规则与 uri 匹配,至步骤 6
- 在所有 prefix 规则和 disable regex prefix 规则中进行匹配(与这些规则定义的顺序无关),
- 假如没有匹配到规则,至步骤 3;假如存在匹配的规则,选择出最长匹配 uri 的规则:
- 假如规则是 disable regex prefix 类型,至步骤 6
- 假如规则是 prefix 类型,记住当前匹配的 prefix 规则,选为待定,至步骤 3
- 一一遍历 case-sensitive regex 规则和 case-insensitive regex 规则(按照这些规则定义的前后顺序):
- 假如规则匹配,则遍历终止,至步骤 6
- 假如规则没有匹配,则继续
- 假如之前有 prefix 规则条目被选择为待定,至步骤 6
- 匹配失败,返回404,结束
- 选择当前规则,使用其配置,结束
图解

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 详细解析 nginx uri 如何匹配 location 规则