Nginx location 匹配优先级
概述
Nginx location 匹配规则很灵活,灵活是优点,也是缺点,因为灵活也就意味着复杂,今天我们一起学习 Nginx 路由匹配规则和优先级。
Location 分类
可以将路由匹配规则分为两大类:
- 非正则路由规则,或者称之为前缀匹配规则
- 正则路由规则
前缀匹配规则分为以下三种:
- location = /some/uri,
location =
规则是精确匹配,只有请求 uri 和=
号后面的路由完全相同才能匹配; - location ^~ /some/uri,
^~
规则要求请求 uri 必须以 /some/location 为前缀才能匹配成功; - location /some/uri,注意 location 指令和 /some/uri 之间没有任何修饰符,这种路由匹配规则和上面的相同,但是优先级不同,这个在后面会详细说明。
Location 匹配示例
以下使用 √ 表示匹配,× 表示不匹配.
1、location = /a/b
请求 uri | 匹配结果 |
---|---|
/a/b | √ |
/a | × |
/b | × |
2、location ^~ /a/b
请求 uri | 匹配结果 |
---|---|
/a/b | √ |
/a/b/c | √ |
/a | × |
/b | × |
3、location /a/b
请求 uri | 匹配结果 |
---|---|
/a/b | √ |
/a/b/c | √ |
/a | × |
/b | × |
正则匹配规则分为两种:
- location ~* /some/.*,
~*
后面为一个正则表达式,匹配时不区分大小写; - location ~ /some/.*,
~
后面是一个正则表达式,匹配时区分大小写;
Location 匹配优先级
- 如果请求 uri 和
location =
路由规则完全匹配,则匹配完成,不再匹配其他规则,否则继续匹配。 - 将请求 uri 和
location ^~
和location
(不带修饰符的规则)规则匹配,找出最长匹配前缀的 location 规则,如果最长匹配前缀的规则为location ^~
,则匹配结束并使用该路由规则处理请求,否则记住最长前缀的路由规则,继续正则匹配; - 使用正则路由规则匹配请求 uri,如果找到匹配的路由规则,则使用该规则处理请求,匹配结束。如果没有正则路由规则和请求 uri 匹配,则使用上一步记住的最长前缀的路由规则处理请求。
这里我们需要仔细阅读第二点,从第二点可以看出,location ^~
规则并不一定比正则表达式路由规则的优先级高,只有 location ^~
规则是最长匹配前缀的时候,它的优先级才比正则路由规则高。因此我们可以得出以下结论:
location =
规则优先级最高,只要请求 uri 和该规则完全匹配,就会使用该规则处理请求;location ^~
和正则表达式规则的优先级取决于location ^~
规则是否是最长前缀匹配规则,如果答案为是,则优先级高于正则,否则优先级低于最长前缀规则。
什么是最长前缀路由规则
假设请求 uri 为 /a/b/c/d.html,并且以下三个路由规则:
- location /a
- location ^~ /a/b
- location /a/b/c
这三个路由规则都可以匹配请求 uri,但是很显然第三个是最长前缀路由匹配规则。
有问题吗?点此反馈!
温馨提示:反馈需要登录