自己开发反向代理,如何实现同时代理多个后端的网站

2014-11-14 17:19:35 +08:00
 restran
前提:
反向代理的网站地址为proxy.com,后端有多个网站,如a.comb.com

目标:
我想通过proxy.com来访问后端的这些网站。比如proxy.com/a/来访问a.com,方法不限。

约束:
后端的这些网站页面中的链接都是使用相对地址,例如/static/img.png

那么问题就是,遇到页面中这样的相对地址,我要如何才能区分出访问的是哪个后端网站。


现在想到几个方法:
1. 通过设置cookie
在cookie中设置访问的是哪个网站,但是缺点是,直接将url复制给其他人,其他人是访问不了的,因为要先确认访问的是哪个网站,然后设置相应的cookie。可以通过访问另外一个网站,然后跳转过来,这样来实现。

2. 二级域名
在proxy.com上使用二级域名来区分,比如a.proxy.com来确定a.com

3. 重写页面中的链接地址
在代理上重写页面中的相对地址,例如把 /static/img.png 改成 /a/static/img.png

那么,有没有更好的方法?
5638 次点击
所在节点    问与答
26 条回复
TONYHEAD
2014-11-14 17:30:30 +08:00
我用二级域名的方法,一个二级域名对应一个目标网站。

http://0zv.net/
chinvo
2014-11-14 17:32:56 +08:00
nginx 貌似就能實現吧……
restran
2014-11-14 17:33:24 +08:00
@TONYHEAD 二级域名方法可行,但是现在我没办法用到二级域名。为了尽量对后端的网站程序灵活,都是约束为相对地址,尽量不在链接地址前面加上前缀。这样以后部署到一个域名下面如site_a.com,也可以正常访问,不用改代码。
restran
2014-11-14 17:35:44 +08:00
@chinvo 那说说呗,求分享。困扰我的是怎么处理页面中相对地址的问题。
chinvo
2014-11-14 17:39:01 +08:00
等等……nginx 貌似沒法實現頁面鏈接的重寫
0x142857
2014-11-14 17:58:49 +08:00
@chinvo 当然可以。
restran
2014-11-14 18:00:37 +08:00
@0x142857 求分享。
0x142857
2014-11-14 18:05:42 +08:00
subs_filter ?
restran
2014-11-14 19:57:27 +08:00
@0x142857 就是用方法3,重写页面中的链接地址吧
0x142857
2014-11-14 19:59:41 +08:00
你可以直接匹配或正则匹配 /static/img.png 替换
restran
2014-11-14 20:03:25 +08:00
@0x142857 那我也可以直接在自己开发的代理程序里面做替换,好像效果是一样的,不知道性能有没有差。
abelyao
2014-11-14 23:09:59 +08:00
楼主能否说一下如何反向代理一个网站,PHP 虚拟主机行不行?还是需要一个 VPS 呢?
有没有现成的方案?
restran
2014-11-14 23:26:05 +08:00
@abelyao 可以用nginx,现在我也还在研究如何能完全的做到反向代理。
restran
2014-11-14 23:32:21 +08:00
@0x142857 这个方法感觉不靠谱,不仅可能替换错,而且还很容易遗漏。
0x142857
2014-11-15 00:08:02 +08:00
基本不会出什么错 :)
msg7086
2014-11-15 07:58:58 +08:00
为什么不检查referer?
restran
2014-11-15 08:09:41 +08:00
@msg7086 检查referer的目的是什么?
rrfeng
2014-11-15 10:07:04 +08:00
这个开发上就有问题,没得解……
chinvo
2014-11-15 11:33:49 +08:00
@0x142857 nginx 有可以對頁面進行改變的模塊?
restran
2014-11-15 11:53:23 +08:00
@chinvo subs_filter 可以对页面的内容进行替换,也就是字符串替换,但这样做并不完美,因为可能有些内容我们本不想替换,也会给替换掉。

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

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

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

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

© 2021 V2EX