天天看点

nginx的location指令(实战示例、匹配顺序、匹配冲突)1. 对url的匹配2. 匹配顺序3. 匹配间的冲突

文章目录

  • 1. 对url的匹配
    • 1.1 默认匹配
    • 1.2 精确匹配( = )
    • 1.3 正则,区分大小写 ( ~ )
    • 1.4 正则表达式,不区分大小写 ( ~* )
  • 2. 匹配顺序
    • 2.1 示例(精确匹配最高)
    • 2.2 示例(字串匹配次之)
    • 2.3 示例(正则匹间配高于通用匹配)
    • 2.4 示例(正则表达式间前边的为准)
    • 2.5 示例(通用匹配兜底)
  • 3. 匹配间的冲突
    • 3.1 通用匹配 VS 字串匹配
    • 3.2 暂时没有发现 :)

1. 对url的匹配

1.1 默认匹配

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

1.2 精确匹配( = )

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

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

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

           

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

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

           

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";
    }

}
           
  • 访问测试
[[email protected] nginx-crow-test]# curl http://localhost:1840/crow/test.md
精确匹配
           
可见精确匹配被匹配到。

下边我们去掉精确匹配:

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";
    }

}
           
  • 访问测试
如下可见,还剩

字串匹配

正则匹配

通用匹配

,结果匹配到了

字串匹配

[[email protected] nginx-crow-test]# curl http://localhost:1840/crow/test.md
字串匹配
           

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";
    #}

}
           
  • 访问测试
[[email protected] nginx-crow-test]# curl http://localhost:1840/crow/test.md
正则表达式,区分大小写
           

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";
    }
}
           
  • 访问测试
[[email protected] nginx-crow-test]# curl http://localhost:1840/crow/test.md
正则表达式,不区分大小写
           

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";
    }

}
           
  • 访问测试
[[email protected] nginx-crow-test]# curl http://localhost:1840/crow/test.txt
通用匹配
           

3. 匹配间的冲突

3.1 通用匹配 VS 字串匹配

通用匹配

字串匹配

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

3.2 暂时没有发现 😃

3.1 很孤独,我又暂时没有发现 3.2 ,留个位置,欢迎大家补充。
nginx的location指令(实战示例、匹配顺序、匹配冲突)1. 对url的匹配2. 匹配顺序3. 匹配间的冲突

继续阅读