1. 先看实例
- 直接访问http://172.17.0.3:8080/nrsc/study/nginx-study,可以访问到我部署的一个项目
- nginx配置,server如下
server {
listen 9000;
server_name nginx-study.nrsc.com;
#后台服务原始路径:http://172.17.0.3:8080/nrsc/study/nginx-study
#port后无/,访问路径:http://nginx-study.nrsc.com:9000/nrsc/study/nginx-study
location /nrsc/study { #匹配路径/nrsc/study,剩余路径/nginx-study
proxy_pass http://172.17.0.3:8080;#此处未关闭,传递整个路径/nrsc/study/nginx-study
}
#port后有/,访问路径:http://nginx-study.nrsc.com:9000/yoyo/nrsc/study/nginx-study
location /yoyo {#匹配路径/yoyo,剩余路径/nrsc/study/nginx-study
proxy_pass http://172.17.0.3:8080/;#此处关闭,只传递/nrsc/study/nginx-study,
#并不传递匹配上的/yoyo
}
}
- 按照配置中注释所写的访问路径进行访问,得到的结果如下:
即两种nginx配置方式都成功访问到了项目.
2. proxy_pass后有"/“和无”/"的区别
2.1总结
其实区别我已经在上面的配置文件中写出来了,这里总结如下
假设:
①一个访问路径(URL)端口号后面的路经可以分为两部分: location匹配中的部分 + location未匹配中的部分
②proxy_pass的路径也可以分为两部分IP地址 + 端口号
则:
-
当proxy_pass的端口号后面没有"/"时,类似于上篇文章讲到的root,用户访问到的资源为IP地址: 端口号/location匹配中的部分/ location未匹配中的部分
-
当proxy_pass的端口号后面有"/"时,类似于上篇文章讲到的alias,用户访问到的资源为IP地址: 端口号/ location未匹配中的部分
2.2 ★★★★★五星级注意(一个大坑)★★★★★
2.1中提到的的两个假设如果变成下面的情况会是怎样???
假设:
①一个访问路径(URL)端口号后面的路经可以分为两部分: location匹配中的部分 + location未匹配中的部分
②proxy_pass的路径若为三部分:IP地址 + 端口号+ 路径
- 也许大多数人会有如下的推测
server {
listen 9001;
server_name nginx-study.nrsc.com;
#后台服务原始路径:http://172.17.0.3:8080/nrsc/study/nginx-study
#proxy_pass末尾没有/,推测的访问路径:http://nginx-study.nrsc.com:9001/study/nginx-study
location /study {#匹配路径/study ,剩余路径/nrsc/study/nginx-study
proxy_pass http://172.17.0.3:8080/nrsc;#按理说末尾没有"/"即此处未关闭,
#会传递/study/nginx-study,则可以访问到项目
}
#proxy_pass末尾有/,推测的访问路径:http://nginx-study.nrsc.com:9001/yoyo/study/nginx-study
location /yoyo {#匹配路径/yoyo,剩余路径/nrsc/study/nginx-study
proxy_pass http://172.17.0.3:8080/nrsc/;#此处关闭,只传递/study/nginx-study
}
}
- 直接进行验证
由验证结果我们可以看出,我们的推测结果并不对,真实的情况是:
nginx的proxy_pass代理的路径里究竟为
proxy_pass后面的路径/location匹配的内容/location未匹配的内容
还是为
proxy_pass后面的路径/location未匹配的内容
取决于proxy_pass中的端口号后面有没有"/"
3. 按照2.2再做一个小demo
- 最后再做一个小demo----按照下面两种访问路径都可以正确访问到资源
server {
listen 9002;
server_name nginx-study.nrsc.com;
#后台服务原始路径:http://172.17.0.3:8080/nrsc/study/nginx-study
#port后有/,访问路径:http://nginx-study.nrsc.com:9002/yoyo1/study/nginx-study
location /yoyo1 {#匹配路径/yoyo1,剩余路径/nrsc/study/nginx-study
proxy_pass http://172.17.0.3:8080/nrsc;#此处关闭,只传递/study/nginx-study
}
#port后有/,访问路径:http://nginx-study.nrsc.com:9002/yoyo2/study/nginx-study
location /yoyo2 {#匹配路径/yoyo2,剩余路径/nrsc/study/nginx-study
proxy_pass http://172.17.0.3:8080/nrsc/;#此处关闭,只传递/study/nginx-study
}
}
- 验证一下
- 可以看到上面两种方式都可以正确的访问到资源,也许有人已经看出来了:
第一种方式代理后的路径为
http://172.17.0.3:8080/nrsc/study/nginx-study-----与后台服务原始路径是一致的
但第二种方式代理后的路径为
http://172.17.0.3:8080/nrsc//study/nginx-study------与后台服务原始路径相比nrsc后面多了一个"/"
但是这一点关系都没有.