文章不易,请关注公众号 毛毛虫的小小蜡笔,多多支持,谢谢。

语法和优先级

语法

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

上面的语法中,location后面第一个参数是可选的。

=,是精确匹配。当匹配到了,则结束。
^,是正则匹配,区分大小写。
^*,是正则匹配,不区分大小写。
^~,是前缀匹配。

第一个参数不填,后面跟着/uri。此时也是前缀匹配。只是优先级在正则匹配之后。
第一个参数不填,后面跟着/。此时也是前缀匹配。只是优先级在所有匹配之后。也就是都匹配不到,则匹配该location。

比如下面的配置:

location /uri {
    # ...
}
location / {
    # ...
}

优先级

当配置文件中有 =,优先匹配该 location,匹配到了,则结束匹配。匹配不到,则先找是否有 ^~。

有 ^~,则优先匹配该 location。匹配到了,则结束匹配。匹配不到,则按照配置文件顺序,从上到下匹配。
先匹配第一个正则,匹配到了,则结束。
匹配不到,则往下匹配。
如果没有一个正则都匹配不到,则匹配 /uri。有,则匹配该 location,然后结束。如果没有,则匹配 /。有,则匹配该 location,然后结束。没有,则提示404。

所以把 = 放到第一个位置,能提高匹配速度。

另外,location的所有匹配,都只对不带参数的请求的uri进行匹配的。
比如 /test 和 /test?a=1 是一样的。

Demo

精确匹配

比如访问地址是:http://localhost/test.png

// 输出4
server {
    listen       80;
    server_name  localhost;
    location ^~ /test.png {
        add_header Content-Type 'text/html;charset=utf-8';
        return 200 1;
    }
    location ~ /test.png {
        add_header Content-Type 'text/html;charset=utf-8';
        return 200 2;
    }
    location ~* /test.png  {
        add_header Content-Type 'text/html;charset=utf-8';
        return 200 3;
    }
    location = /test.png {
        add_header Content-Type 'text/html;charset=utf-8';
        return 200 4;
    }
}

因为配置中有 =,所以优先匹配,然后结束。

前缀匹配

优先前缀匹配:^~
前缀匹配:/



详情 请查看:毛毛虫的小小蜡笔


simonbaker
256 声望2 粉丝

wx:毛毛虫的小小蜡笔