nginx location

优先级顺序


location在nginx中的功能是指根据匹配不同的URI请求,做出不同后端响应处理

location基本语法结构,如下

  1. location [ = | ~ | ~* | ^~ ] /URI { … }

  2. location @/name/ { … }

location匹配顺序

nginx有二层指令来匹配请求的URI,第一层是根据server段定义的server_name常指的就是域名;第二层就是具体的location规则,具体的顺序如下

  1. 绝对、精确匹配,只要匹配成功则不立即break,不会继续匹配其它的规则

    location = /字符串 { }

  2. 带参前缀匹配,匹配成功停止匹配其它

    location ^~ /字符串 { }

  3. 区分大小写的正则匹配,与之对的 !~,! 就是否定的意思,不匹配

    location ~ ^/api { }

    location ~ ^/Api { }

  4. 不分区大小写正则匹配,与这对应的 !~*

    location ~* ^/api

    对/api /Api都会匹配成功

  5. 通用匹配,通常是指其它的规则都没有匹配成功走最后一条匹配规则

    location / { }

 location范例,典型案例

  1. 按规则优先级匹配,当不指定任何规则,默认是区分大小写匹配

    server {
        server_name website.com;
        location /doc {
            return 701; # 用这样的方式,可以方便的知道请求到了哪里
        }
        location ~* ^/document$ {
            return 702; 
    
        }
    }

    curl -I website.com:8080/document 返回 返回 HTTP/1.1 702

  2. 按规则的优先级匹配,如下

    server {
        server_name website.com;
        location /document {
            return 701;
        }
        location ~* ^/document$ {
            return 702;
        }
    }

    curl http://website.com/document 返回 HTTP/1.1 702
    结果还是第二条规则命中

  3. 按规则的优先级匹配,如下

    server {
        server_name website.com;
        location ^~ /doc {
            return 701;
        }
        location ~* ^/document$ {
            return 702;
        }
    }

    curl http://website.com/document 返回 HTTP/1.1 701

    ^~ 规则命中,匹配立即停止匹配其它规则

  4. 前缀匹配的优先顺序如下
    server {
        server_name website.com;
        location /docu {
            return 701;
        }
        location /doc {
            return 702;
        }
    }

    curl -I website.com:8080/document 会返回 HTTP/1.1 701

    server {
        server_name website.com;
        location /doc {
            return 702;
        }
        location /docu {
            return 701;
        }
    }

    curl -I website.com:8080/document 依然返回 HTTP/1.1 701

    结论:前缀匹配下,是按字符串的长度作为第一优先级
  5. 同等级正则匹配,是按照规则的前后顺序

    server {
        listen 8080;
        server_name website.com;
    
        location ~ ^/doc[a-z]+ {
            return 701;
        }
    
        location ~ ^/docu[a-z]+ {
            return 702;
        }
    }

    curl -I website.com:8080/document 返回 HTTP/1.1 701

    server {
        listen 8080;
        server_name website.com;
    
        location ~ ^/docu[a-z]+ {
            return 702;
        }
        
        location ~ ^/doc[a-z]+ {
            return 701;
        }
    }

    curl -I website.com:8080/document 返回 HTTP/1.1 702

参考文献


一文理清nginx中的location配置(系列一) - 知乎 (zhihu.com)

posted @ 2022-08-21 18:49  MacoPlus  阅读(45)  评论(0编辑  收藏  举报