概述
前提环境:
- NGINX
涉及参考文档:
Nginx官方文档 ngx_http_core_module 模块
location 语法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
优先级
= > ^~ > ~ = ~* > /
= 对uri 做精确匹配,优先级最高。
^~ 对uri【起始字符】,做字符串匹配(注意不是正则匹配),区分大小写,以匹配长度为优先,表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
~ 对uri【可以不是起始字符】,做正则表达式匹配,区分大小写
~* 对uri【可以不是起始字符】,做正则表达式匹配,不区分大小写
/ 匹配【起始于此字符】串的所有uri,区分大小写
第一优先级:等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
第二优先级:^~类型表达式()。一旦匹配成功,则不再查找其他匹配项。
第三优先级:正则表达式类型(~ ~*)的优先级一致。
第四优先级:常规字符串匹配类型,按前缀匹配。
匹配规则注意点:
1、 字符匹配 【^~ /】比较字符,同时符合匹配规则,匹配 location 表达式长的规则。
2、 ~ 与 ~* 优先级一致。
3、 ^~ 对uri【起始字符】匹配,不支持正则匹配,匹配成功不再进行后续的查找。
实验测试:
原配置文件:
vim /etc/nginx/conf.d/location.conf
server {
listen 81;
server_name www.nginx-location.com *.nginx-location.com; #需要将yourdomain.com替换成证书绑定的>域名。
access_log /var/log/nginx/host.access.log main;
location = /img { #精确匹配
return 701;
}
location ^~ /img { #对uri【起始字符】,做字符串匹配(注意不是正则匹配)
return 702;
}
location ~ /img { #对uri【可以不是起始字符】,做正则表达式匹配,区分大小写
return 703;
}
location ~* /img { #对uri【可以不是起始字符】,做正则表达式匹配,不区分大小写
return 704;
}
location /img { #匹配【起始于此字符】串的所有uri,区分大小写
return 705;
}
#location ^~ /bot-sca/.*.(gif|jpg|jpeg)$ {
location ^~ /bot-sca/1.jpg { #仅仅支持字符串匹配(注意不是正则匹配)。可将1.jpg替换成正则
return 200;
}
location / {
return 666;
}
# location /SMS {
# alias /oss/bot_ai_inspect_test/location;
# }
}
1、【^~ /】 location 字符串匹配冲突
- 检测Nginx配置文件
nginx -t
原因: 【^~ /】 都是字符串进行匹配, 造成冲突, 将 【^~ /】 其中一个location匹配修改 /imgs
2、 字符串匹配,匹配 location 表达式长的规则优先级高
vim /etc/nginx/conf.d/location.conf
server {
listen 81;
server_name www.nginx-location.com *.nginx-location.com; #需要将yourdomain.com替换成证书绑定的>域名。
access_log /var/log/nginx/host.access.log main;
location = /img { #精确匹配
return 701;
}
location ^~ /img { #对uri【起始字符】,做字符串匹配(注意不是正则匹配)
return 702;
}
location ~ /imgage { #对uri【可以不是起始字符】,做正则表达式匹配,区分大小写
return 703;
}
location ~* /imgage { #对uri【可以不是起始字符】,做正则表达式匹配,不区分大小写
return 704;
}
location /imgs { #匹配【起始于此字符】串的所有uri,区分大小写
return 705;
}
#location ^~ /bot-sca/.*.(gif|jpg|jpeg)$ {
location ^~ /bot-sca/1.jpg { #仅仅支持字符串匹配(注意不是正则匹配)。可将1.jpg替换成正则
return 200;
}
location / {
return 666;
}
# location /SMS {
# alias /oss/bot_ai_inspect_test/location;
# }
}
nginx -s reload
- 请求: curl -I www.nginx-location.com:81/imgs
按逻辑分析, 配置文件 ^~ /img 、 /imgs 、 / 都符合匹配规则,且按符号优先级应该是 ^~ 返回状态码:702 ,但实际返回状态码是705 ,由此可推出 【同是字符串匹配,匹配 location 表达式长的规则优先级高】
3、 正则的匹配优先级大于字符串匹配
vim /etc/nginx/conf.d/location.conf
server {
listen 81;
server_name www.nginx-location.com *.nginx-location.com; #需要将yourdomain.com替换成证书绑定的>域名。
access_log /var/log/nginx/host.access.log main;
location = /img { #精确匹配
return 701;
}
location ^~ /img { #对uri【起始字符】,做字符串匹配(注意不是正则匹配)
return 702;
}
location ~ /img { #对uri【可以不是起始字符】,做正则表达式匹配,区分大小写
return 703;
}
location ~* /img { #对uri【可以不是起始字符】,做正则表达式匹配,不区分大小写
return 704;
}
location /imgs { #匹配【起始于此字符】串的所有uri,区分大小写
return 705;
}
#location ^~ /bot-sca/.*.(gif|jpg|jpeg)$ {
location ^~ /bot-sca/1.jpg { #仅仅支持字符串匹配(注意不是正则匹配)。可将1.jpg替换成正则
return 200;
}
location / {
return 666;
}
}
nginx -s reload
- 请求: curl -I www.nginx-location.com:81/imgs
按逻辑分析, 配置文件 ^~ /img 、 ~ /img、~* /img、 /imgs 、 / 都符合匹配规则,上面测试location 匹配 /imgs 返回状态码705, 在第一轮匹配 ^~ /img 被pass 掉了 不再进行匹配,此时 /imgs 在发起匹配 ~ /img、~* /img 符合匹配, 由于~ /img ~* /img 没有优先级区别 , 返回状态码为 703
4、 ^~ 不支持正则匹配
vim /etc/nginx/conf.d/location.conf
server {
listen 81;
server_name www.nginx-location.com *.nginx-location.com; #需要将yourdomain.com替换成证书绑定的>域名。
access_log /var/log/nginx/host.access.log main;
location = /img { #精确匹配
return 701;
}
location ^~ /img { #对uri【起始字符】,做字符串匹配(注意不是正则匹配)
return 702;
}
location ~ /img { #对uri【可以不是起始字符】,做正则表达式匹配,区分大小写
return 703;
}
location ~* /img { #对uri【可以不是起始字符】,做正则表达式匹配,不区分大小写
return 704;
}
location /imgs { #匹配【起始于此字符】串的所有uri,区分大小写
return 705;
}
location ^~ /bot-sca/.*.(gif|jpg|jpeg)$ {
#location ^~ /bot-sca/1.jpg { #仅仅支持字符串匹配(注意不是正则匹配)。可将1.jpg替换成正则
return 200;
}
location / {
return 666;
}
}
- 请求:curl -I www.nginx-location.com:81/bot-sca/a.jpg
若是^~ 支持 正则匹配的话 ^~ /bot-sca/.*.(gif|jpg|jpeg)$ 符合 匹配规则,返回状态码: 200 ,但在图中可以看到返回的状态码为666。
最后
以上就是精明纸飞机为你收集整理的Nginx location 指令匹配的全部内容,希望文章能够帮你解决Nginx location 指令匹配所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复