nginx 二级目录,反向代理内网某个端口的设备。出现 404 如何解决?

2018-08-15 11:49:18 +08:00
 mostkia

问题描述:nginx 服务器,二级目录 [比如 www.a.com/test/] 想反向代理内网某个端口的设备 [比如:192.168.1.101:8080 ] ,代理成功后,首页正常显示,但出现了大量 404 错误。

Nginx 配置文件: location /test/ { proxy_pass http://192.168.1.101:8080/; }

内网设备情况: html 文件是写入设备固件内的,无法修改,内部包含相对路径和绝对路径的资源引用。 比如有这样的引用: /css/style.css js/ui.js

反代后,虚拟地址 www.a.com/test/ 等价于 192.168.1.101:8080 但 /test/style.css 这类绝对路径资源,却依旧会跑到根目录去读取,结果变成以下情况: www.a.com/css/style.css 导致找不到文件。出现 404 错误。

请问有没有朋友碰到过类似的情况,是否有好的解决方案?

5002 次点击
所在节点    NGINX
6 条回复
WordTian
2018-08-15 12:06:41 +08:00
因为会把 /test/这个路径传给内网设备。也许可以加个重写 url 的规则?
neoska
2018-08-15 15:14:42 +08:00
Nginx 配置文件:location /test/ { proxy_pass http://192.168.1.101:8080/; }
试试去掉 8080 后面的 /
popvlovs
2018-08-15 16:27:56 +08:00
是不是命中了其他高优先级的 location 规则,比如
location ~* \.(?:css|js)$
dbolo123
2018-08-15 23:01:21 +08:00
你的 html 引入的 css 路径写成了 /css/style.css ,是会这样的,改成 css/style.css 就行,不过可能会带来新的问题
mostkia
2018-08-16 17:40:01 +08:00
@dbolo123 是的,但这个设备嵌入式设备,html 是写入在 flash 里面的,目前没法改。目前的临时方法,是将那些需要用到的绝对路径内容,也通过 nginx 代理到前端服务器上面,这样虽然能解决问题,但网站之间的独立性就受到影响了,基本就和初衷背离了,还不如整站全部反代了畅快。。希望有更好的办法吧。
mostkia
2018-08-16 17:42:20 +08:00
@popvlovs 这个没有问题,我是新开了一台 nginx 站点来测试的,测试前去掉了所有不必要的规则。问题很明确,就是因为被代理的服务器内,html 有很多静态资源的绝对引用,导致代理到新站点后,不得不照顾和考虑到这些绝对引用,否则就会出现 404,的确是比较蛋疼的问题。

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

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

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

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

© 2021 V2EX