一、location不带前缀匹配
c
# 不带/
location / {
proxy_pass http://192.168.1.11;
}
# 带/
location / {
proxy_pass http://192.168.1.11/;
}
1.不带子路径
在浏览器访问
shell
http://x.x.x.x
在日志中的显示区别。可以看出 多了一个/
shell
"GET /"
"GET //"
返回结果是一样的
2.带子路径
在浏览器访问
shell
http://x.x.x.x/server
在日志中的两种location 的结果是一样的
shell
GET /server/
GET /server/
3.总结:
location和proxy_pass都是默认配置,带不带/ 访问效果都一样
二、location带前缀匹配
1.proxy_pass 不带/
c++
location /server {
proxy_pass http://192.168.1.11;
}
# 浏览器访问
http://x.x.x.x/server/a
# 日志显示结果如下
GET /server/a/
# 也就是说nginx会把location中的url以及子路径拼接给proxy_pass 的后端地址
2.proxy_pass 带/
c++
location /server {
proxy_pass http://192.168.1.11/;
}
# 浏览器访问
http://x.x.x.x/server/a
# 日志显示结果如下
GET //a/
这里可以看出,proxy_pass 带上/以后,再转发时候不会带上 location中的url(这里指的server这个url),但是后续的子路径(这里指的是/a)会拼接到porxy_pass的路径上
三、proxy_poass带后缀
有时候后端使用的tomcat,tomcat中有很多接口,也就是用很多目录区分的,这时候在转发的时候就就需要带上目录名称了。
1.location无前缀 proxy有后缀
如果是以下配置
shell
location / {
proxy_pass http://192.168.1.11/server;
}
访问
shell
http://x.x.x.x/test/data
在后端日志中显示,发现test和server之间没有/隔开。所有就404了
shell
GET /servertest/data
所以配置需要加上/,如下
c
location / {
proxy_pass http://192.168.1.11/server/;
}
这样结果就正确了,在后端日志中显示正常了
c
GET /server/test/data
2.总结
proxy_pass 最后的/ 有两个作用
2.1 去掉location中的url,不做拼接,但是会拼接后续的子路径。
2.2 在路径拼接的时候,会加上一个/