Nginx 反向代理路径问题
2023年8月6日...大约 2 分钟
问题
详细说一下遇到的问题。
当前有两个api接口如下,这两个接口都存在跨域问题,且我无法修改后端的接口:
http://192.168.1.110/api/user?id=101
http://192.168.5.110/api/user?id=101
可见这两个api接口除了主机地址不同,协议、路径、参数都一样,由于改不了后端,所以我需要在前端处理跨域问题。
因为不是很熟悉 nginx 的配置,按照网上的教程配完反向代理后发现 nginx 代理实际向后端请求的接口不对,下面是最开始的配置:
location /api1 {
proxy_pass http://192.168.1.1;
proxy_set_header Host $host;
}
location /api2 {
proxy_pass http://192.168.0.1;
proxy_set_header Host $host;
}
前端请求的 url 是 /api1/api/user?id=101
和 /api2/api/user?id=101
解决
网上查阅后发现,location
和 proxy_pass
这两个的路径末尾加不加 /
区别还是很大,首先看看我最开始的配置,配置中 location
的路径末尾不带 /
,而 proxy_pass
的路径末尾不带 /
,查看后端的请求日志可以看到,后端实际收到的请求地址是:
/api1/api/user?id=101
显然该地址在后端是不存在的,然后在 proxy_pass
的末尾添加 /
之后,后端实际收到的请求地址是:
//api/user?id=101
显然,该地址也是不合法的地址,然后在 location
的路径末尾添加 /
之后,后端实际收到的请求地址是:
/api/user?id=101
这个地址才是正确的地址。
最后将配置文件修改一下,问题就解决了:
location /api1/ {
proxy_pass http://192.168.1.1/;
proxy_set_header Host $host;
}
location /api2/ {
proxy_pass http://192.168.0.1/;
proxy_set_header Host $host;
}
结尾
可以看到 location
和 proxy_pass
的路径结尾加不加 /
影响显著,排列组合下来有好几种情况,更多不同的组合的实际请求地址可以看看这篇文章:
Powered by Waline v3.4.2