编写本文时,使用的nginx版本为nginx/1.17.9和nginx/1.16.1
路由匹配规则
location路由匹配的大致规则:location [=|^~|~|~*|@] path { ... }
如果大家对这块内容比较熟悉了,可以直接到优先级疑惑点这里看一个比较奇怪的匹配逻辑。
精确匹配(=)
location配置的path和客户端请求的path完全一致时匹配成功。
匹配成功后,nginx就会停止搜索其他匹配项。
server {
listen 2020;
location = /test {
return 200 '=';
}
}
- 请求
localhost:2020/test
,匹配成功,响应内容为"=" - 请求
localhost:2020/test?num=1
,匹配成功,响应内容为"=" - 请求
localhost:2020/test/
,匹配失败,响应状态码404 - 请求
localhost:2020/test/1
,匹配失败,响应状态码404
前缀匹配(^~)
location配置的path为客户端请求的path前缀时匹配成功。
匹配成功后,nginx还会判断是否存在后面这种情况{(location修饰符为^~
|| location没有修饰符) && location配置的path是客户端请求的前缀},如果存在,就使用匹配项最多的作为最后的匹配结果。
server {
listen 2020;
location ^~ /test {
return 200 '^~';
}
}
- 请求
localhost:2020/test
,匹配成功,响应内容"^~" - 请求
localhost:2020/test/1
,匹配成功,响应内容"^~" - 请求
localhost:2020/test111
,匹配成功,响应内容"^~" - 请求
localhost:2020/tes
,匹配失败,响应状态码404
server {
listen 2020;
location ^~ /test {
return 200 '/test';
}
location ^~ /test/1 {
return 200 '/test/1';
}
}
- 请求
localhost:2020/test
,匹配成功,响应内容"/test" - 请求
localhost:2020/tes
,匹配成功,响应内容"/test" - 请求
localhost:2020/test/1
,匹配成功,响应内容"/test/1"。这里两个location配置都匹配上了,第一个location匹配项为1,第二个location匹配项为2,由于nginx选用匹配项最多的location,所以响应内容"/test/1"。
正则匹配(~ 和 ~*)
修饰符~
,正则匹配区分大小写。修饰符~*
,正则匹配不区分大小写。
正则匹配以location在文件中的定义顺序从上到下进行匹配。匹配成功以后,nginx就停止搜索其他匹配项。
注意:mac os文件系统大小写不敏感,因此nginx服务配置的location path不区分大小写,nginx使用和*效果是一样的。linux文件系统大小写敏感,因此nginx服务区分大小写,nginx使用和*效果与前面介绍的效果一致。
~例子
server {
listen 2020;
location ~ /test_a {
return 200 '~';
}
}
- 请求
localhost:2020/test_a
,匹配成功,响应内容"~" - 请求
localhost:2020/test_A
,匹配成功和失败都有可能,得看nginx服务所在的系统对于大小写是否敏感。mac os系统下,匹配成功&#