如何在Nginx中配置多个网站的反向代理并保持URL不变?

nginx 配置问题,
需求是: 有A,B,C等多个网站,多个网站分布在不同的服务器上,希望通过配置nginx配置实现
实现如下需求

  1. 输入A的网址,例如:localhost:4488,可以访问A网址
  2. 输入 localhost:4488/b/, 可以访问到B的网址,但是要求url不要发生变化, 且刷新正常(B网址有前端判断是否登录自动跳转到不同的路由)
  3. 输入localhost:4488/c/, 可以访问到C的网址,

尝试使用反向代理,但是访问时前端静态资源访问不了
使用重定向,可以访问,但是刷新就会出错(因为会跳转到login页面,但是A网址的nginx配置没有login指向)

阅读 637
2 个回答

b网站和c网站,前端需要“适配”一下。

如果是 hash 模式,需要把 静态资源目录 的设置成 相对目录 ./

如果是 history 模式,那前端在打包的时候,需要调整 publicPath 或者 base url 。

可以使用 Nginx 的反向代理和子路径配置。以下是一个示例配置,展示如何通过 Nginx 实现你描述的功能:

server {
    listen 4488;
    server_name localhost;

    location / {
        proxy_pass http://A服务器地址;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /b/ {
        proxy_pass http://B服务器地址/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 替换响应中的静态资源路径
        sub_filter '/static/' '/b/static/';
        sub_filter_once off;

        # 确保前端跳转逻辑正常工作
        proxy_redirect default;
    }

    location /c/ {
        proxy_pass http://C服务器地址/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 替换响应中的静态资源路径
        sub_filter '/static/' '/c/static/';
        sub_filter_once off;
    }
}

关键点在于 sub_filter 指令,它可以重写响应中的 URL,以确保静态资源路径正确。sub_filter_once off 确保所有匹配的字符串都被替换,而不仅仅是第一次出现的。
请根据实际的服务器地址替换 A服务器地址、B服务器地址 和 C服务器地址。

推荐问题
宣传栏