Nginx中location匹配规则及陷阱

location常用匹配

  • = :精准匹配
  • ~ :正则匹配
  • ~* :正则匹配,不区分大小写
  • ^~ : 普通字符匹配, ^~ 的含义是如果命中,则不会再进行任何的正则匹配
  • 前面没有任何修饰: 普通字符匹配

location匹配顺序

  1. 精确匹配
  2. 普通匹配
  3. 正则匹配
    看到这里大家可能会有点疑问,有可能会跟现有认知上有些冲突,没关系,继续看完。。

匹配规则

  1. 首先进行精准匹配,如果匹配上则停止匹配
  2. 进行最大普通匹配,如果匹配到:
    • 假如加了前缀^~,则停止匹配
    • 假如为普通匹配,则继续进行步骤3
  3. 进行正则匹配

    其中,在普通匹配时要遵循最大长度匹配原则。然后在正则匹配时,只要匹配一次就停止后续的匹配。所以在这里,假如为普通字符匹配(无 ^~ 修饰符的匹配),会继续执行正则匹配,假如正则匹配上,那么正则匹配就会覆盖普通匹配,所以也就是所谓的正则优先

匹配陷阱

1.例如有以下配置:

    location = / {
        root /var/html;
        index  index.html;
    }

    location / {
        root /var1/html;
        index  index.html;
    }

当访问http://localhost/时,首先匹配的是第一个精准匹配,由于/表示的是目录,所以nginx重新将请求转向到http://localhost/index.html,此时第一个匹配不成功,于是匹配到了第二个location。

2.然而如下配置:

        location = /acom {
            root   html;
            index  index.html index.htm;
        }

        location / {
                root html;
                index index.html;
        }

当访问http://localhost/acom的时候,直接返回第一个匹配结果中的index.html。
这是实验结果,具体原因还需要继续探究。

猜你喜欢

转载自blog.csdn.net/lchpersonal521/article/details/81436024