Nginx配置中location匹配规则详解(3)

把例题 2 中的 location / {} 修改成 location ^~ / {} ,再看看测试结果:

URI 请求   修改前   修改后  
curl :9090/   403 Forbidden   403 Forbidden  
curl :9090/index.html   Welcome to nginx!   403 Forbidden  
curl :9090/index_notfound.html   404 Not Found   403 Forbidden  
curl :9090/exact/match.html   404 Not Found   404 Not Found  

除了 GET /exact/match.html 是 404 Not Found ,其余都是 403 Forbidden ,原因很简单所有请求都是以“ / ”开头,所以所有请求都能匹配上“ / ”普通 location ,但普通 location 的匹配原则是“最大前缀”,所以只有/exact/match.html 匹配到 location /exact/match.html {allow all;} ,其余都 location ^~ / {deny all;} 并终止正则搜索。

例题 4 :“ = ”前缀的使用

server {

listen       9090;

server_name  localhost;

location /exact/match.html {

allow all;

}

location = / {

root   html;

index  index.html index.htm;

deny all;

}

location ~ \.html$ {

allow all;

}

}

例题 4 相对例题 2 把 location / {} 修改成了 location = / {} ,再次测试结果:

URI 请求   修改前   修改后  
curl :9090/   403 Forbidden   403 Forbidden  
curl :9090/index.html   Welcome to nginx!   Welcome to nginx!  
curl :9090/index_notfound.html   404 Not Found   404 Not Found  
curl :9090/exact/match.html   404 Not Found   404 Not Found  
curl :9090/test.jsp   403 Forbidden   404 Not Found  

最能说明问题的测试是 GET /test.jsp ,实际上 /test.jsp 没有匹配正则 location ( location ~\.html$ ),也没有匹配 location = / {} ,如果按照 location / {} 的话,会“最大前缀”匹配到普通 location / {} ,结果是 deny all 。

#4 正则 location 与编辑顺序

location 的指令与编辑顺序无关,这句话不全对。对于普通 location 指令,匹配规则是:最大前缀匹配(与顺序无关),如果恰好是严格精确匹配结果或者加有前缀“ ^~ ”或“ = ”(符号“ = ”只能严格匹配,不能前缀匹配),则停止搜索正则 location ;但对于正则 location 的匹配规则是:按编辑顺序逐个匹配(与顺序有关),只要匹配上,就立即停止后面的搜索。

配置 3.1

server {

listen       9090;

server_name  localhost;

location ~ \.html$ {

allow all; 

location ~ ^/prefix/.*\.html$ {

deny all; 

}

配置 3.2

server {

listen       9090;

server_name  localhost;

location ~ ^/prefix/.*\.html$ {

deny all; 

location ~ \.html$ {

allow all; 

}

测试结果:

URI 请求   配置 3.1   配置 3.2  
curl :9090/regextest.html   404 Not Found   404 Not Found  
curl :9090/prefix/regextest.html   404 Not Found   403 Forbidden  

解释:

Location ~ ^/prefix/.*\.html$ {deny all;} 表示正则 location 对于以 /prefix/ 开头, .html 结尾的所有 URI 请求,都拒绝访问;   location ~\.html${allow all;} 表示正则 location 对于以 .html 结尾的 URI 请求,都允许访问。 实际上,prefix 的是 ~\.html$ 的子集。

在“配置 3.1 ”下,两个请求都匹配上 location ~\.html$ {allow all;} ,并且停止后面的搜索,于是都允许访问, 404 Not Found ;在“配置 3.2 ”下, /regextest.html 无法匹配 prefix ,于是继续搜索 ~\.html$ ,允许访问,于是 404 Not Found ;然而 /prefix/regextest.html 匹配到 prefix ,于是 deny all , 403 Forbidden 。

配置 3.3

server {

listen       9090;

server_name  localhost;

location  /prefix/ {

deny all; 

location  /prefix/mid/ {

allow all; 

}

配置 3.4

server {

listen       9090;

server_name  localhost;

location  /prefix/mid/ {

allow all; 

location  /prefix/ {

deny all; 

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2d90b26db45d702ecf1754d5cf5e0825.html