Nginx location 匹配优先级记录
location 主要形式
- 精确匹配:location = /abc { }
- 截断前缀匹配(匹配路径的前缀,如果匹配到则立刻返回。不会继续向下匹配正则规则):location ^~ /abc { }
- 不区分大小写的正则匹配:location ~* /abc { }
- 正则匹配:location ~ /abc { }
- 普通路径前缀匹配:location /abc { }
location 优先级
在如下前提下,优先级:1 > 2 > 3 > 4 > 5
前提:客户端请求URL是:http://localhost/abc
备注:我们暂且只记录优先级,不考虑uri和代理路径拼接逻辑。
location 优先级解释
location = /abc {
# 精确匹配 /abc ,例如 http://localhost:8888/abc。
[ configuration A ]
}
location / {
# 缺省匹配,优先级最低:因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求,如果所有规则都没匹配到,则匹配到这条规则。
[ configuration B ]
}
location /documents/ {
# 普通路径前缀匹配:匹配任何以 /documents/ 开头的地址,匹配到以后,还要继续往下匹配。
# 只有后面的正则表达式没有匹配到且也没有更长的前缀匹配时,才会采用这一条返回。
[ configuration C ]
}
location ~ /documents/Abc/Deh {
# 正则匹配:匹配任何以 /documents/Abc/Deh 开头的地址,匹配到以后,还要继续往下匹配。
# 只有后面的正则表达式没有匹配到且也没有更长的前缀匹配时,才会采用这一条返回。
[ configuration D ]
}
location ~ /documents/Abc {
# 正则匹配:匹配任何以 /documents/Abc 开头的地址,匹配到以后,还要继续往下匹配。
# 只有后面的正则表达式没有匹配到且也没有更长的前缀匹配时,才会采用这一条返回。
[ configuration E ]
}
location ^~ /documents/ {
# 截断前缀匹配:匹配任何以 /documents/ 开头的地址,匹配到以后,停止往下搜索正则,采用这一条返回。
[ configuration F ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 不区分大小写的正则匹配:匹配所有以 gif,jpg或jpeg 结尾的请求。
# 但是,如果请求地址是:http://localhost:8888/documents/c.jpg 时,会被 configuration F 先处理并直接返回。因为 ^~ /documents/ 是“截断前缀匹配” ,截断了,到达不了这一条正则。
[ configuration G ]
}
location /images/ {
# 普通路径前缀匹配:会继续往下,会发现 ^~ 存在。
# H和J的放置顺序是没有关系的。
# 只有后面的正则表达式没有匹配到且也没有更长的前缀匹配时,才会采用这一条返回。
[ configuration H ]
}
location ^~ /images/ {
# 截断前缀匹配:匹配任何以 /images/ 开头的地址,匹配到以后,停止往下搜索正则,采用这一条返回。
[ configuration I ]
}
location /images/abc {
# 普通路径前缀匹配:更长。
# H与I的放置顺序是没有关系的。
[ configuration J ]
}
location ~ /images/ {
# 正则匹配:匹配任何以 /images/ 开头的地址,匹配到以后,还要继续往下匹配。
# 只有后面的正则表达式没有匹配到且也没有更长的前缀匹配时,才会采用这一条返回。
[ configuration K ]
}
优先级验证
备注:我们暂且只记录优先级,不考虑uri和代理路径拼接逻辑。