• nginx中location匹配规则


    前言:nginx的location匹配顺序对于新手来说,上手不太容易,需要一个好的教程,查看了好多的博客,下面总结一下,给大家一个好点的教程吧。

    一、先说一下locatin表达式的类型

      = 表示普通字符精确匹配。也就是完全匹配。

      ^~ 表示普通字符匹配。使用前缀匹配,如果匹配成功,则不再匹配其他location。

      ~ 表示执行一个正则匹配,区分大小写。

      ~* 表示执行一个正则匹配,不区分大小写。

      @ 它定义一个命名的location,使用在内部定向时,例如 error_page,try_files。

      以上这几个符号,要记住,下面的匹配规则,都是基于以上几个符号的。

    二、详细的讲一下以上的符号

    1.全部的location,分为普通location和正则location。

      “~”和“~*”前缀的表示正则location(“~”区分大小写,“~*”不分区大小写)

      剩下的(“=”,“^~”,“@”)和无任何前缀的都属于普通location。

    2.普通location与正则location之间的匹配,选择出普通location的最大前缀匹配结果后,还需要继续搜索正则location。如果继续搜索的正则location也有匹配上,那么正则location将覆盖掉普通location的最大前缀匹配

    3.普通location之间:最大前缀匹配

    4.正则与正则:按照正则location在配置文件中的顺序匹配的,并且只要匹配到一条正则location,就不在考虑后面的。

    5.匹配到普通location后,不在需要继续匹配正则location:只要在普通location前面加上“^~”符号或者“=”严格精确匹配结果(^表示非,~表示正则,字符意思是:不要继续匹配正则)。

    “^~”和“=”共同点都可以阻止继续匹配,不同点是“^~”依然遵守“最大前缀”匹配规则,而“=”不是“最大前缀”,是必须严格匹配。

    三、下面讲几个例子

    1.

    location = / {
      index index.html;
      [conf A]
    }
    
    location / {
      [conf B] 
    }

    输入http://127.0.0.1/ 会执行到哪里呢?

    会执行到conf B,怎么精确匹配的优先级不灵了呢?

    事实上,精确匹配还是起作用了,请求目录(非具体文件),nginx会将请求内部定向到index文件,即此时真正的请求是http://127.0.0.1/index.html,这时conf B被命中。

    所以精确匹配不要用/来匹配。

    2.

    location /documents/ {
      #匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      #只有后面的正则表达式没有匹配到时,这一条才会采用
      [conf A]
    }
    
    location /documents/index.html {
        [conf B]
    }
    
    location ~ /documents/ {
    [conf C] }

    输入127.0.0.1/documents/index.html会匹配哪个呢?

    会匹配到conf C,因为这个url匹配conf A,也匹配conf B,由于conf B的长度比conf A的长度长,所以conf B被记忆下来,但是后面的正则表达式也匹配,所以就会将前面覆盖掉。

    3.

    location /documents/ {
      #匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
      #只有后面的正则表达式没有匹配到时,这一条才会采用
      [conf A]
    }
    
    location ~ /documents/ {
      [conf B]
    }
    
    location ~ /documents/index.html {
        [conf C]
    }
    

    输入127.0.0.1/documents/index.html会匹配哪个呢?  

    会匹配到conf B,首先conf A是匹配的,但是由于是普通location,所以被记忆下来,后面是正则匹配,conf B正好符合,所以就将前面的覆盖掉,终止然后返回了,不在继续向下执行。

    4.

    location /documents/ {
      [conf A]
    }
    location ^~ /documents/index.html {
      [conf B]
    }
    location ~ /documents/ {
      [conf C]
    }
    

    输入127.0.0.1/documents/index.html会匹配哪个呢?  

    这个会匹配conf B,前两个都是普通匹配,但是由于conf B是“^~”,正好它也是最长前缀,所以将不会在匹配正则location,最终匹配到conf B。

  • 相关阅读:
    leetcode 【 Merge Two Sorted Lists 】 python 实现
    leetcode 【 Remove Duplicates from Sorted List II 】 python 实现
    leetcode 【 Remove Duplicates from Sorted List 】 python 实现
    leetcode 【 Remove Nth Node From End of List 】 python 实现
    leetcode 【 Linked List Swap Nodes in Pairs 】 python 实现
    i++操作非原子的验证代码
    黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
    mysql 原理 ~ sql查询语句
    tidb 架构 ~Tidb学习系列(3)
    mysql 查询优化 ~ 善用profie利器
  • 原文地址:https://www.cnblogs.com/kacha886/p/9112009.html
Copyright © 2020-2023  润新知