nginx 二级目录反向代理是不是有先天缺陷?

68 天前
 kyonn

如下一个最简化的反代配置,将本地 80/443 端口的 /git/ 反代到本地容器的 8085 端口。

访问 127.0.0.1/git/ 成功跳转到 8085 端口容器的 web 页面,但是发现有诸多问题:

  1. css 和 png 加载失败。抓了下调试信息,发现是容器返回的样式等文件地址都是绝对路径 /,进而导致浏览器请求样式文件时,没有正确走 location /git/ 的反代。通过 sub_filter 指令批量替换后解决了。
  2. 问题 1 解决后,点击其它页面元素,还是会出现 404 错误。原因同 1

类似这种二级目录的反向代理,是不是天然有缺陷,没办法像 二级域名 或 三级域名 反代那样完美实现?

注:

  1. 域名管理不在手上,添加多个二级或三级域名比较麻烦,所以考虑的是同一个域名下的子目录。
  2. 可以修改反代 upstream docker 的配置,因为是自己部署的。
location /git/ {
    proxy_http_version 1.1;
    proxy_pass http://192.168.1.13:8085/;
}
3954 次点击
所在节点    NGINX
40 条回复
kyonn
68 天前
@Alfchao
@jspatrick
@Charles0929
@Suaxi

OK ,我按照这个关键字找下解决方案。因为是部署的是别人打包的容器,不是自己写的代码,不确定能否设置 context-path
irisdev
68 天前
额楼主不是说代理的是开源容器吗,怎么楼上还有让楼主改代码的,写脚本批量替换路径是不是能解决?
635925926
68 天前
你写了/给你访问/。请问哪里有问题了?
zhhbstudio
68 天前
看上去是 sub_filter 没写全,根据不能用的页面针对性加一下
clarkethan
68 天前
这是你博客引用静态资源的路径应该做对应的修改,nginx 不背这个锅
coderzhangsan
68 天前
#1 已经说明问题了,这不是 nginx 的问题,这是 web 页面静态资源路径的问题,静态资源相对路径后面要加上/git/,否则不会触发 nginx /git/ 重写规则,会按当前 nginx 配置去搜寻静态资源路径。
ssiitotoo
68 天前
你要知道你的入口是 nginx 了然后你配置了/git/代理到你后端 请求 nginxip/js/1.js 等静态资源在 nginx 那儿是找不到 需要在资源路劲前添加/git/才能请求到你后 8085 的资源
SenLief
68 天前
前端程序员问题,项目不支持二级路径反代就不行。
kyonn
68 天前
问题已经解决了,按照大家提供的信息,我去修改了 被反代服务的静态资源 context-path ,加了 /git/ 子目录,目前看暂时工作正常了。

-----------

问题信息缺失引起歧义了。本意是想问 针对 这类二级目录 反代的情况,在不修改被反代服务的情况下,能否利用 nginx 一些特殊的配置做到类似 二级域名 反代那样的效果。提问的缺陷也是指 二级目录反代缺陷,而不是说 nginx 有缺陷。

因为被反代的服务通常不是自己写的(开源的第三方服务),如果再修改它的静态资源打包方式比较麻烦,要额外修改被反代的项目。除了静态资源,我也也比较好奇,是否有其它的限制比较难处理,比如#11 提到的问题。

另一方面,因为域名解析控制权不在我这,所以加二级域名、三级域名也比较麻烦。所以倾向于使用同一个域名下二级目录反代的方式。


@perfectlife
@RobinHuuu
@momocraft
@SanjinGG
@maocat
@duanxianze
@totoro625
@skiy
@Alfchao
@jspatrick
@Charles0929
@Suaxi
@irisdev
@zhhbstudio
@coderzhangsan
@ssiitotoo
@SenLief
w292614191
68 天前
我也倾向 /git ,然后 nginx 自动处理,但不行,只能修改项目的 basePath 之类的。自己的项目还好,第三方项目就很麻烦
idealhs
68 天前
目前遇到的大部分都支持设置 basePath ,也是有很多小项目前端整的不好确实没法这么用的。
wwhontheway
68 天前
对,非常难受,之前想用 nginx 二级目录的方式代理多个 kibana ,结果一堆静态文件找不到。最后看到的解法也是去被代理的机器上修改一些东西。虽然可行,但是还需要去被代理服务修改配置就很难受
muyuanqiang7
68 天前
我记得可以用 rewrite path 来处理静态文件的加载,但是在有些 api 请求上还是有点问题。代理第三方的是可以解决的,问下 AI 吧
kyonn
68 天前
@muyuanqiang7 按我的理解,rewrite path 应该只能重写 原始请求的 uri ,如果 被代理机器返回的就是 /xxx.css ,浏览器就按 /xxx.css 去请求静态资源,这时候 rewrite 就不起作用了。除非把本机所有 /xxx.css 类的请求都 rewrite 给 被代理机器,但是这个改动会影响第 2 个被代理机器。

假如只有一台被代理机器,应该是可行的。不知道我的理解是否正确。
awsl2333
68 天前
@kyonn
1. 二级域名转发,每个服务一个域名
2. 不同端口,每个端口一个服务
konakona
68 天前
首先,在 Nginx 配置中,需要明确理解其作用范围。/git/ 的配置仅对该子目录生效,这并非 Nginx 的缺陷,而是对其作用机制的误解。

如果不是特意将主域名分发至多个不同的 endpoint 服务上,应注意 endpoint 的 contextpath 。如果使用的是开源镜像等固定 contextpath 的服务,且无法修改,则可以通过 sub-filter 实现所需功能。
muyuanqiang7
68 天前
@kyonn 你说的和我之前问 AI 回答的意思差不多,但是我的实际使用的时候是我不加 rewrite 的情况下,我的 css 、js 、png 请求地址就是/,但是当我加了 rewrite 后被代理的第三方服务的请求静态资源就正常了。
echo21bash
68 天前
老运维一看题目就知道是,后端源代码写的绝对路径,甩锅给研发 ok
adoal
68 天前
V2EX 里的月经问题了。如果反代后方应用没有“我的前方可能会有一个反代服务器,把不同 Host 不同 port 不同 prefix 的请求转给我,所以我需要在生成页内链接时做调整”的意识,这个问题就是没有完美解的。

一个不得已的托底方法是用 mod_substitute 对后方应用生成的页面做内容替换。当然,这种替换不能保证 100%无假阴无假阳。
ttkit
67 天前
你的 css ,js 资源引用打包时应该用完整的域名路径: http://m.ccc.om/a.css 而不是 /a.css ,这样可以解决你这个问题吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1149767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX