如何使用Nginx将主机路径反向代理到绝对URL?
如何使用Nginx将主机路径反向代理到绝对URL?
嗨,我完全懂你遇到的这个问题——之前配置反向代理的时候也踩过一模一样的坑!你碰到的路径被自动追加的问题,根源其实就在proxy_pass的写法上,只要加个小小的斜杠就能轻松搞定。
问题原因
你当前的配置里,proxy_pass http://db这种不带末尾斜杠的写法,Nginx会默认把匹配到的location路径(也就是/db)直接追加到后端地址后面,所以实际转发的地址就变成了http://db/db,对应到你的后端服务就是localhost:3002/db,这显然和你想要的结果不符。另外还要提一句,你原配置里的server_name 0.0.0.0和所有proxy_pass语句末尾都没加分号,这是语法错误,必须补上哦!
解决方法
只要在每个proxy_pass的后端地址末尾加上斜杠/,Nginx就会自动把匹配到的location路径去掉,只把剩余的请求路径(这里没有剩余内容,就直接转发到后端的根路径)传给目标服务。
修改后的完整正确配置如下:
http { sendfile on; upstream app { server localhost:3000; } upstream api { server localhost:3001; } upstream db { server localhost:3002; } server { listen 80; server_name 0.0.0.0; location / { proxy_pass http://app/; } location /api { proxy_pass http://api/; } location /db { proxy_pass http://db/; } } }
额外小提示
如果之后你遇到更复杂的路径转发需求(比如要把/foo/bar转发到后端的/baz路径),可能需要用到rewrite规则,但这次你的场景用末尾斜杠就完全足够了,简单又高效。
备注:内容来源于stack exchange,提问作者Vaune_




