问题描述: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 错误。
请问有没有朋友碰到过类似的情况,是否有好的解决方案?
因为会把 /test/这个路径传给内网设备。也许可以加个重写 url 的规则?
Nginx 配置文件:location /test/ { proxy_pass http://192.168.1.101:8080/; }
试试去掉 8080 后面的 /
是不是命中了其他高优先级的 location 规则,比如
location ~* \.(?:css|js)$
你的 html 引入的 css 路径写成了 /css/style.css ,是会这样的,改成 css/style.css 就行,不过可能会带来新的问题
是的,但这个设备嵌入式设备,html 是写入在 flash 里面的,目前没法改。目前的临时方法,是将那些需要用到的绝对路径内容,也通过 nginx 代理到前端服务器上面,这样虽然能解决问题,但网站之间的独立性就受到影响了,基本就和初衷背离了,还不如整站全部反代了畅快。。希望有更好的办法吧。
这个没有问题,我是新开了一台 nginx 站点来测试的,测试前去掉了所有不必要的规则。问题很明确,就是因为被代理的服务器内,html 有很多静态资源的绝对引用,导致代理到新站点后,不得不照顾和考虑到这些绝对引用,否则就会出现 404,的确是比较蛋疼的问题。