背景
使用 Nginx 作为反向代理访问一个服务,是很常见的应用场景,但是在配置时,/
符号使用不当,会导致会映射到原本服务器时,与预期要访问的目标不一致。
比如:
location /nginx_location/ {
proxy_pass http://server/;
}
其中,location
和 proxy_pass
的内容,最后的 /
符号是容易被忽略的细节。按照上面的配置,其实在我们心中,期待的结果能符合这样的规律:
访问的结果,是 Nginx 将
location
中匹配的部分,替换成proxy_pass
中指定的内容。
但实际上,大部分情况还是符合这个预期的,也有个别情况引起混乱
假设:
- 通过 Nginx 访问的 URL:
http://nginx/nginx_location/some/path
- 期待的访问目标:
http://server/some/path
但实际的结果,与 /
的使用,以及映射目标为根路径或者其它位置都会导致一些差异。
测试结果
先说测试结果:
通过 Nginx Server 访问 http://nginx/nginx_location/some/path
proxy_pass
直接映射到主机,没有其他路径
location | proxy_pass | 实际访问目标 | 关注 |
---|---|---|---|
/nginx_location/ |
http://server |
http://server/nginx_location/some/path |
☆ |
/nginx_location/ |
http://server/ |
http://server/some/path |
|
/nginx_location |
http://server |
http://server/nginx_location/some/path |
☆ |
/nginx_location |
http://server/ |
http://server//some/path |
proxy_pass
直接映射到主机的 /test
location | proxy_pass | 实际访问目标 | 关注 |
---|---|---|---|
/nginx_location/ |
http://server/test |
http://server/testsome/path |
☆ |
/nginx_location/ |
http://server/test/ |
http://server/test/some/path |
|
/nginx_location |
http://server/test |
http://server/test/some/path |
|
/nginx_location |
http://server/test/ |
http://server/test//some/path |
这些是对于 location
和 proxy_pass
分别是否带有 /
的测试结果。可以总结如下:
- 引发关注问题的,都是
location
或proxy_pass
不带/
的,所以最好都带上 - 对于映射目标直接是主机,不带任何路径的,也不带
/
, 会将/nginx_location/
自动拼接
通过 Nginx Server 访问 http://nginx/nginx_locationxxx/some/path
测试过程中,发现对于 location
不带 /
的情况,在一些特殊场景也有一些有意思的效果,整理出来以便发现规律,但还是建议正常情况不要这么使用。
proxy_pass
直接映射到主机,没有其他路径
location | proxy_pass | 实际访问目标 | 关注 |
---|---|---|---|
/nginx_location |
http://server |
http://server/nginx_locationxxx/some/path |
☆ |
/nginx_location |
http://server/ |
http://server/xxx/some/path |
☆ |
proxy_pass
直接映射到主机的 /test
location | proxy_pass | 实际访问目标 | 关注 |
---|---|---|---|
/nginx_location |
http://server/test |
http://server/testxxx/some/path |
☆ |
/nginx_location |
http://server/test/ |
http://server/test/xxx/some/path |
☆ |
测试环境:1.15.7
(完)