请问 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; } }
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; } } ```
这个问题要程序自己处理干净,尽量不假设自己一定在根,不然只能采用古老的重写页面内链的办法了(但很遗憾,这在现代复杂 Web 应用场景下不工作)。 现实中很多应用是不支持把自己配置到非根位置的…这就没太好的办法了。
因为 a 前端路由的 root 还是 /,反代并不会改变代码,所以访问 root+/login 的时候还是 /login ,而不是 /a/login 你可以改变 a 的代码,把 root 改成 /a ,或者添加 root 变量,然后在 nginx 反代代码里用 sub_filter 替换