IT俱乐部 Nginx nginx location指令(匹配顺序匹配冲突)实战示例详解

nginx location指令(匹配顺序匹配冲突)实战示例详解

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. 匹配顺序

  • 精确匹配(=
  • 字串匹配(^~
  • 正则匹配(~~*
  • 默认匹配()

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";
    }
}
  • 访问测试
[root@liubei 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";
    }
}
  • 访问测试

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

[root@liubei 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";
    #}
}
  • 访问测试
[root@liubei 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";
    }
}
  • 访问测试
[root@liubei 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";
    }
}
  • 访问测试
[root@liubei 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

以上就是nginx location指令(实战示例匹配顺序匹配冲突)使用详解的详细内容,更多关于nginx location指令的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/server/nginx/9195.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部