nginx 配置问题

meluo
  • 216
回复
阅读 2.3k
4 个回答
Feng_Yu
  • 10.5k

你这种需求属于不同prefix的反向代理,我以前搞过。我的经验是建议你趁早放弃,这种需求非常难搞,几乎不太可能在不修改后端的条件下,仅靠nginx完成。

给你举个例子,你的后端实际是localhost:3000/a,而你的反向代理前段期望用户访问的路径是localhost/render/a。URL location问题可以在nginx做,但是返回的html的内容nginx却没有办法直接修改。所以你代理得到的html页面的内容可能写的还是/a/xxx.js,而不是你期望的/render/a/xxx.js,于是反向代理失效。

解决方法只能是把后端的prefix改掉,改成和前段反向代理同样加一层/render/。或者能自适应,同时支持直接访问与反向代理,但是这样后端的设计会复杂。

唯一能搞的就是你的后端是一个Restful的api,或者是download下载站,几乎不会返回html页面的这种,那没问题,配置也简单,直接反向代理即可。

以前用apache有个rewrite_html的插件,这个插件可以在反向代理的时候直接修改a标签的链接,达到让反向代理生效的目的,不过依旧很难搞,因为页面上并不只是标签会涉及到路径,还有js中也可能会引用一些其他资源的路径,所以rewrite_html也不一定完全能实现你的需求。

此外,还有更多的坑等着你,期待你去发掘。

$ wget 127.0.0.1/render/a

location ^~ /render {
    proxy_pass http://127.0.0.1:3000/;    // http://127.0.0.1:3000/a
}

location ^~ /render {
    proxy_pass http://127.0.0.1:3000;     // http://127.0.0.1:3000/render/a
}

不知道是不是这个需求

这其实就是一个虚拟目录的问题。如果你在iis下开发过虚拟目录网站就知道,这个一开始就限制了你的网站路径规划。所以除非你能修改网站路径规划,否则你可以直接放弃了。
修改的方式简单说就是加入一个配置变量prefix,在每个有路径的地方都加入$prefix这样的前缀,发布前根据情况替换$prefix。当然,如果你使用了页面模版,那么相对就轻松多了。

http://localhost/render/a写成./a,浏览器获取资源时会自动添加完整域名用来补全
配置的话nginx配置中有个"location / {"的配置项,更改一下就行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏