You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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_

火山引擎 最新活动