我是靠谱客的博主 精明纸飞机,最近开发中收集的这篇文章主要介绍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。

最后

以上就是精明纸飞机为你收集整理的Nginx location 指令匹配的全部内容,希望文章能够帮你解决Nginx location 指令匹配所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部