• nginx的location指令(实战示例、匹配顺序、匹配冲突)


    1. 对url的匹配

    1.1 默认匹配

    • 语法示例
        location /crow/ {
           return  501 "通用匹配\n";
        }
    
    • 1
    • 2
    • 3

    1.2 精确匹配( = )

    • 语法示例
        location = /crow/ {
           return  501 "精确匹配\n";
        }
    
    • 1
    • 2
    • 3

    1.3 正则,区分大小写 ( ~ )

    • 语法示例
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
    
    
    • 1
    • 2
    • 3
    • 4

    1.4 正则表达式,不区分大小写 ( ~* )

    • 语法示例
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
    
    
    • 1
    • 2
    • 3
    • 4

    2. 匹配顺序

    1. 精确匹配(=
    2. 字串匹配(^~
    3. 正则匹配(~~*
    4. 默认匹配(

    2.1 示例(精确匹配最高)

    • 配置文件内容:
    server {
        listen    1840;
        root   /usr/share/nginx/html;
    
        location / {
            index  index.html index.php index.htm;
        }
        location /crow/  {
           return  501 "通用匹配\n";
        }
        location = /crow/test.md {
           return  501 "精确匹配\n";
        }
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
        location ^~ /crow/test.md {
           return  501 "字串匹配\n";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 访问测试
    [root@liubei nginx-crow-test]# curl http://localhost:1840/crow/test.md
    精确匹配
    
    • 1
    • 2

    可见精确匹配被匹配到。

    下边我们去掉精确匹配:

    2.2 示例(字串匹配次之)

    • 配置文件内容:
    server {
        listen    1840;
        root   /usr/share/nginx/html;
    
        location / {
            index  index.html index.php index.htm;
        }
        location /crow/  {
           return  501 "通用匹配\n";
        }
        #location = /crow/test.md {
        #   return  501 "精确匹配\n";
        #}
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
        location ^~ /crow/test.md {
           return  501 "字串匹配\n";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 访问测试

    如下可见,还剩 字串匹配正则匹配通用匹配,结果匹配到了 字串匹配

    [root@liubei nginx-crow-test]# curl http://localhost:1840/crow/test.md
    字串匹配
    
    • 1
    • 2

    2.3 示例(正则匹间配高于通用匹配)

    • 配置文件
    server {
        listen    1840;
        root   /usr/share/nginx/html;
    
        location / {
            index  index.html index.php index.htm;
        }
        location /crow/  {
           return  501 "通用匹配\n";
        }
        #location = /crow/test.md {
        #   return  501 "精确匹配\n";
        #}
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
        #location ^~ /crow/test.md {
        #   return  501 "字串匹配\n";
        #}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 访问测试
    [root@liubei nginx-crow-test]# curl http://localhost:1840/crow/test.md
    正则表达式,区分大小写
    
    • 1
    • 2

    2.4 示例(正则表达式间前边的为准)

    上例中我们看到:~在前边,因此先匹配了 ~。如果我们把~~*换个位置

    • 配置文件
    server {
        listen    1840;
        root   /usr/share/nginx/html;
    
        location / {
            index  index.html index.php index.htm;
        }
        location /crow/  {
           return  501 "通用匹配\n";
        }
        
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 访问测试
    [root@liubei nginx-crow-test]# curl http://localhost:1840/crow/test.md
    正则表达式,不区分大小写
    
    • 1
    • 2

    2.5 示例(通用匹配兜底)

    • 配置文件

    我们还是将所有匹配都写上

    server {
        listen    1840;
        root   /usr/share/nginx/html;
    
        location / {
            index  index.html index.php index.htm;
        }
        location /crow/  {
           return  501 "通用匹配\n";
        }
        location = /crow/test.md {
           return  501 "精确匹配\n";
        }
        location ~ /crow/.*\.md {
           return  501 "正则表达式,区分大小写\n";
        }
        location ~* /crow/.*\.md {
           return  501 "正则表达式,不区分大小写\n";
        }
        location ^~ /crow/test.md {
           return  501 "字串匹配\n";
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 访问测试
    [root@liubei nginx-crow-test]# curl http://localhost:1840/crow/test.txt
    通用匹配
    
    • 1
    • 2

    3. 匹配间的冲突

    3.1 通用匹配 VS 字串匹配

    通用匹配字串匹配相同时,启动报错

    • 配置文件
        location /crow/test.md {
           return  501 "通用匹配\n";
        }
        location ^~ /crow/test.md {
           return  501 "字串匹配\n";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 启动报错如下:
    nginx-crow-test | nginx: [emerg] duplicate location "/crow/test.md" in /etc/nginx/conf.d/default.conf:45
    
    • 1

    3.2 暂时没有发现 😃

    3.1 很孤独,我又暂时没有发现 3.2 ,留个位置,欢迎大家补充。


    在这里插入图片描述

  • 相关阅读:
    神经网络深度学习(四)特征处理
    MutationObserver-基本使用
    人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总)
    todolist案列——vue脚手架(完整版)
    QT中QByteArray与char、int、float之间的互相转化
    MySQL下载步骤详解
    python的简单爬取
    一文解读高压放大器
    mysql建数据库时我们的字符集如何选择
    linux使用apt命令下载软件和依赖包
  • 原文地址:https://blog.csdn.net/xingzuo_1840/article/details/127587906