目录

Nginx的location匹配优先级

一直以来觉得自己掌握了nginx,直到昨天面试发现自己说的location匹配优先级都不正确。主要原因也是之前没有做过多location的配置,没有去想过这个点,造成面试不理想。故写此博客理解location匹配的优先级。

前言

location是由ngx_http_core_module模块提供的指令

官网链接:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

语法及优先级:

location含义优先级
=/uri精确匹配1
/uri无前缀非完整路径匹配4
^~ /uri路径匹配2
~ pattern区分大小写的正则匹配3
~* pattern不区分大小写的正则匹配3

:数字越大代表优先级越低

测试

首先根据6种匹配优先级设定测试文件,并分别配置对照组测试优先级

=/uri/uri

例1:

1
2
3
4
5
6
7
location =/1/2/1.txt {
	return 111;
}
  
location /1/2/1.txt {
    return 222;
}

使用curl请求测试

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
111

结论=/uri 的优先级高于 /uri

/uri^~

例2:

1
2
3
4
5
6
7
location /1/2/1.txt {
	return 111;
}

location ^~ /1/2/ {
	return 222;
}

这里如果路径匹配也是/1/2/1.txt,会提示重复。意味着如果都是完整路径,路径匹配与无前缀匹配一致。

curl请求测试

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
111

例3:

1
2
3
4
5
6
7
location /1/2/ {
	return 111;
}

location ^~ /1/2 {
    return 222;
}

curl请求测试

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
222

结论^~/uri在非全路径时具有更高的优先级,但为全路径时/uri的优先级等于^~

^~~

例4:

1
2
3
4
5
6
7
location ~ \/1\/2/1\.txt$ {
	return 111;
}

location ^~ /1/2/1.txt {
	return 222;
}

curl请求测试

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
222

例5:

1
2
3
4
5
6
7
location ^~ /1 {
	return 222;
}
 
location ~ \.txt$ {
	return 111;
}

curl请求测试:

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
222

结论:路径匹配^~的优先级高于正则表达式匹配~

/uri~

例6:

1
2
3
4
5
6
7
location /1/2 {
	return 222;
}
 
location ~* \.txt$ {
	return 111;
}

curl请求测试

1
2
[root@bochs nginx]# curl -m 1 -s -w %{http_code} -o /dev/null http://www.dmesg.top:82/1/2/1.txt
111

例7:

1
2
3
4
5
6
7
location /1/2/1.txt {
        return 222;
}
 
location ~* \.txt$ {
        return 111;
}  

curl请求测试

1
2
[root@bochs nginx]# curl -m1 -s -w %{http_code} -o /dev/null www.dmesg.top:82/1/2/1.txt
111

结论:无论/uri是否是完整路径,正则匹配的优先级都是高于无前缀匹配/uri

总结

从上面的几个实验可以发现优先级关系。

精确匹配= > 路径匹配^~ > 正则匹配~ > 无前缀匹配/uri

特殊的:当无前缀匹配中的uri为全路径时,优先级等于路径匹配。