请教一个 nginx 转发的问题

查看 50|回复 4
作者:ShihanW   
请问 V 友,nginx 如何使用路由转发不同的服务啊,比如机器上有两个服务,一个部署在 8080 端口(假设服务名为 a ),另一个在 8888 (服务名 b ),我的预期是分别设置/a 和/b 用以转发这两服务,并且它们的子路由也要转发,例如它们都有登陆,就分别为/a/login和/b/login,但是我在访问/a 页面时点击登陆,浏览器路由就自动变成/login了,忽略了/a,这要这么办呢,难道我还要在 nginx 里对它们的子路由单独设置转发规则吗。
我现在是这样配置的
{
    listen 443;
   
    location /a {
        proxy_pass http://localhost:8080;
    }
   
    location /b {
        proxy_pass http://localhost:8888;
    }
}
klo424   
GPT 的答案
```bash
server {
listen 80;
server_name example.com;
location /a/ {
proxy_pass http://localhost:8080/;
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;
# 如果服务 a 使用相对路径构建链接,需要进行重写
# rewrite ^/a/(.*)$ /$1 break;
}
location /b/ {
proxy_pass http://localhost:8888/;
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;
# 如果服务 b 使用相对路径构建链接,需要进行重写
# rewrite ^/b/(.*)$ /$1 break;
}
}
```
iseki   
这个问题要程序自己处理干净,尽量不假设自己一定在根,不然只能采用古老的重写页面内链的办法了(但很遗憾,这在现代复杂 Web 应用场景下不工作)。
现实中很多应用是不支持把自己配置到非根位置的…这就没太好的办法了。
google2020   
因为 a 前端路由的 root 还是 /,反代并不会改变代码,所以访问 root+/login 的时候还是 /login ,而不是 /a/login
你可以改变 a 的代码,把 root 改成 /a ,或者添加 root 变量,然后在 nginx 反代代码里用 sub_filter 替换
Puteulanus   
这个得你后端支持动态的路径,或者支持配置 url prefix ,不然它返回一个 /login 的 302 或者 a 标签给前端,nginx 要管这个得上专门的反代模块用规则去替换后端返回的内容了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部