简介
location 资源匹配的规则与匹配指令和 url 匹配模式有关。其中匹配指令决定了匹配方式,指令 + 模式决定了匹配哪些资源。每个规则大概长这样:
location [匹配指令] url匹配模式 {
...
}
若 location 匹配规则中有匹配指令(=、^ ~、~*),则称此匹配为:精准匹配、前缀匹配和正则匹配;没匹配指令,称为正常匹配或全局匹配。
精准匹配
= 用于精准匹配。此时 url 匹配模式不可使用正则(用了也无效),区分大小写,例如:
location = /demo {
rewrite ^ http://baidu.com;
}
上述配置表示:只有请求的路径是 /demo 时,才会跳转(转发)到百度搜索,除此之外都会异常。
前缀匹配
^~ 用于前缀匹配。此时 url 匹配模式不可使用正则,区分大小写,和 = 不同的是,它匹配的请求路径并不固定,只要是请求路径的前缀和 ^~ 设置的前缀一样即可,例如:
location ^~ /demo {
rewrite ^ http://baidu.com;
}
上述配置表示:只要请求路径前缀是 /demo 时,均可跳转。以下请求路径都能被匹配到:/demo、/demo.jpg、/demo/a、/demoaaa。
正则匹配:
~、~* 用于正则匹配,这样能匹配的范围更广了。注意:前者区分文件大小写,后者不区分文件大小写。
正则匹配允许匹配模式可使用正则,例如:
location ~ /[abcd]emo[\d] {
rewrite ^ http://google.com;
}
按照上述配置表示,以下的请求的路径都会匹配:/aemo9、/demo0、/demo1、/demo2。如果不区分路径大小写,把 ~ 替换成 ~* 即可。
正常匹配
没有匹配指令即为正常匹配,此时 url 的匹配模式可以使用正则,不区分大小写。例如:
location /demo {
rewrite ^ http://google.com;
}
按照上述匹配模式,可匹配到:/demo、/demo/a、/demo/a/b、/demo.jpg、/deMO.AAA、/DEmO.BbB…。
全局匹配
全局匹配可以看作正常匹配的特殊一种,它的 url 匹配模式仅是 /。
location / {
rewrite ^ http://google.com;
}
表示该 server 下的任何一个路径请求,都会跳转。
匹配优先级
按照上述介绍匹配的顺序,优先级为:
精准匹配 > 前缀匹配 > 正则匹配 > 正常匹配 > 全局匹配
这是大的原则,还有小细节,是针对相同匹配类型来制定的:
1、正则匹配成功后停止匹配,非正则匹配成功后会继续匹配;
2、在所有匹配成功的 url 中,选取匹配长度最长的 url 匹配模式;
不同级别匹配优先级
精准匹配 > 前缀匹配
location = /demo {
rewrite ^ http://baidu.com;
}
location ^~ /demo {
rewrite ^ http://google.com;
}
请求和对应的匹配为:/demo => baidu.com、/demo/a => google.com。把前缀匹配换成正则匹配也一样,精准匹配是最大。
前缀匹配 > 正则匹配
location ~ /dem[oi] {
rewrite ^ http://google.com;
}
location ^~ /demo {
rewrite http://baidu.com;
}
请求和对应的匹配为:/demo => baidu.com、/demoi => google.com,可见即使正则匹配先匹配到,也是没前缀匹配优先级大。
正则匹配 > 正常匹配
location /demo/ab {
rewrite ^ http://baidu.com;
}
location ~ /demo/ {
rewrite ^ http://google.com;
}
请求和对应的匹配为:/demo => google.com、/demo/ab => google.com,在大规则前,小规则(匹配长度)也是没效果的。
正常匹配 > 全局匹配
location / {
rewrite ^ http://baidu.com;
}
location /demo {
rewrite ^ http://google.com;
}
请求和对应的匹配为:/demo => google.com、/demo/ab => google.com、/ => baidu.com、’’ => index.html。
同级别的匹配优先级
看两个细节:是否是正则匹配、是否是最长匹配。
location /demo {
rewrite ^ http://baidu.com;
}
location /demo/abc {
rewrite ^ http://google.com;
}
请求和对应的匹配为:/demo/ab => baidu.com、/demo/abc => google.com(谁最长匹配谁)。换成前缀匹配也一样。但是换成正则匹配就不同了:
location ~ /demo {
rewrite ^ http://baidu.com;
}
location ~ /demo/abc {
rewrite ^ http://google.com;
}
请求和对应的匹配为:/demo/abc => baidu.com,这是因为正则匹配和最长匹配无关,仅与匹配的顺序有关,匹配到即截至。
location 资源匹配总结
1、按照匹配指令 + url 匹配模式来决定命中的资源;
2、匹配指令具有优先级,按照一大二小的原则;
服务器禁用用户访问 .git 文件夹
location ^~ /\.git {
deny all;
}