Nginx的location优先级
在nginx配置文件中,location主要有这几种形式:
语法:location [=|^~|~|~*|@] /uri/ { … }
功能: 根据URI的不同需求进行配置,可以使用字符串与正则表达式匹配。 如果要使用正则表达式,你必须指定下列前缀:
~* 不区分大小写。
~ 区分大小写。
具体匹配形式如下:
1. 正则匹配 location ~ /abc { }
2. 不区分大小写的正则匹配 location ~* /abc { }
3. 匹配路径的前缀 location ^~ /abc { }
4. 精确匹配 location = /abc { }
5. 普通路径前缀匹配 location /abc { }
# 优先级:
4 > 3 > 2 > 1 > 5
具体解释:
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ path A ]
}
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ path B ]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ path C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ path CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ path D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 path D 处理,因为 ^~ 到达不了这一条正则
[ path E ]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ path F ]
}
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ path G ]
}
location ~ /images/abc/ {
# 只有去掉 path D 才有效:先最长匹配 path G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ path H ]
}
测试匹配顺序
1. 以下两个匹配规则同时存在时的匹配结果:
2. 以下三个匹配规则同时存在时的匹配结果:
可以看出:正则匹配要大于通用匹配
3. 多个正则匹配
可以看出:多个正则匹配的时候,只匹配到第一个符合条件的正则;
4. 添加精准匹配
只要存在精准匹配,则优先匹配精准匹配;
总结如下
1 匹配优先级如下
① = 精确匹配
② ^~ 优先匹配常规字符串,匹配后,不检查正则
③ ~* 正则匹配 示例: ~*.(gif|jpg|jpeg)$
④ / documents/ 匹配常规字符 documents 代表目录,可以是其他值
⑤ / 所有location无法匹配,则显示该默认匹配
以上可以都有,也可以都没有,如果都有,则按照以上优先级匹配。