Nginx location 指令匹配

前提环境:

  • 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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值