文章不易,请关注公众号 毛毛虫的小小蜡笔,多多支持,谢谢。
语法和优先级
语法
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;
}
}
因为配置中有 =,所以优先匹配,然后结束。
前缀匹配
优先前缀匹配:^~
前缀匹配:/
详情 请查看:毛毛虫的小小蜡笔
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。