[ = | ~ | ~* | ^~ | @ ] /uri/
解释:
基础示例
location ^~/uri/{
...
}
location =/uri/{
...
}
...
最长命中, ^~ 和普通命中,都是优先使用匹配最长的结果 , 且 ^~ 优先级并不比普通匹配高
location ^~ /a {
root /;
}
location ^~ /aaa {
root /aaa;
}
请求url为/aaa,则上面两个location都匹配成功,但用于location ^~ /aaa较长,所以最终会以/aaa作为root。上例中如果是普通匹配(把location的 ^~ 去掉),结果也是一样的
location /test_1 {
return 400;
}
location ^~ /test {
return 401;
}
请求path为/test_1,则上面两个location都匹配成功,但用于location /test_1 较长,所以最终返回的是400,同时也可看出^~ 优先级并不比普通匹配高
得到的最长的location为 ^~ 类型,则表示阻断匹配不再继续,得到的最长的location不是 ^~ 类型,继续匹配
location /test_1 {
return 400;
}
location ^~ /test {
return 401;
}
location ~ /test {
return 402;
}
~ 规则匹配,路径中只要包含就可以匹配,同时正则匹配时,放在前面的优先匹配,如果不区分大小写时,使用 ~*,因此在书写代理时尽量将精确匹配的放在前面
location ~ /hello {
return 602;
}
location ~ /helloworld {
return 601;
}
location ~ /helloworld {
return 601;
}
location ~ /hello {
return 602;
}
location = /world {
return 600;
}
location = /hello {
return 601;
}
location ~ /hellowo {
return 602;
}
location ^~ /hello {
return 603;
}
请求 localhost/world 返回600 := 是精确完整匹配,且优先级最高
请求 localhost/hello 返回601 := 是精确完整匹配,且优先级最高
请求 localhost/hello/123 返回603:^~ 这个规则是前缀匹配,和 = 相比,范围更广,故该请求会被 ^~ 这个规则匹配上,但是 = 不会匹配
请求 localhost/hellow 返回603:如果 ~ 和 ^~ 同时匹配规则,则 ^~ 优先
请求 localhost/hellowo 返回603 :如果 ~ 和 ^~ 同时匹配规则,则 ^~ 优先
请求 localhost/test/hellowo 返回602 :~ 路径中只要包含就可以匹配
请求 localhost/test/hello 返回其他:^~ 这个规则是前缀匹配,不会匹配请求 url 中后面的路径,故该请求没有匹配上
请求 localhost/world2 localhost/test/world 返回其他
这里主要填的是需要匹配的 path 路径,根据前面的符号,这里可以填写精确到 path 路径,也可以填正则表达式,下面则主要针对正则进行说明
location /a {
proxy_pass http://server;
}
实际代理的目标url是http://server/a/b.html (把/a/b.html拼接到http://server之后)
location /a/ {
proxy_pass http://server/;
}
http://server/b.html (把/a/b.html的/a/去掉之后,拼接到http://server/之后)
最好要么两者都加斜杆,要么都不加
以服务地址http://127.0.0.1:5053/api/test/getById进行说明,访问地址是http://127.0.0.1/api/test/getById。location后斜杆与proxy_pass后斜杆问题如下:
location、proxy_pass都不加斜杠,实际代理地址:http://127.0.0.1:5053/api/test/getById
location /api {
proxy_pass http://127.0.0.1:5053;
}
location加斜杠,proxy_pass不加斜杠,实际代理地址:http://127.0.0.1:5053/api/test/getById,【正确的】
location /api/ {
proxy_pass http://127.0.0.1:5053;
}
location不加斜杠,proxy_pass加斜杠,实际代理地址:http://127.0.0.1:5053//test/getById,【错误的】,也出现了双斜杠
location /api {
proxy_pass http://127.0.0.1:5053/;
}
location、proxy_pass都加斜杠,实际代理地址:http://127.0.0.1:5053/test/getById,【错误的】
location /api/ {
proxy_pass http://127.0.0.1:5053/;
}
location不加斜杠,proxy_pass加"api",实际代理地址:http://127.0.0.1:5053/api/test/getById,【正确的】
location /api {
proxy_pass http://127.0.0.1:5053/api;
}
location加斜杠,proxy_pass加"api",实际代理地址:http://127.0.0.1:5053/apitest/getById,【错误的】,少了一个斜杆
location /api/ {
proxy_pass http://127.0.0.1:5053/api;
}
location不加斜杠,proxy_pass加"api/",实际代理地址:http://127.0.0.1:5053/api//test/getById,【错误的】出现双斜杠问题,后端在认证请求时会校验失败
location /api {
proxy_pass http://127.0.0.1:5053/api/;
}
location加斜杠,proxy_pass加"api/",实际代理地址:http://127.0.0.1:5053/api/test/getById,【正确的】
location /api/ {
proxy_pass http://127.0.0.1:5053/api/;
}
https://blog.xqlee.com/article/2504181246151085.html