V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
restran
V2EX  ›  问与答

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

  •  
  •   restran · 2014-11-14 17:19:35 +08:00 · 5618 次点击
    这是一个创建于 3669 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前提:
    反向代理的网站地址为proxy.com,后端有多个网站,如a.com,b.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

    那么,有没有更好的方法?
    第 1 条附言  ·  2014-11-14 17:50:32 +08:00
    困扰我的是怎么处理页面中相对地址的问题。
    第 2 条附言  ·  2014-11-14 23:24:55 +08:00
    方法3,重写页面内的链接地址,发现是非常不靠谱的。自己用nginx subs_filter做了实验,发现页面中有很多链接如<form action="/users/sign_in",src="/img.png",href="/a.html",还有js代码,css代码里面的url链接等等。要全部实现替换可不容易,一不小心就会出现遗漏。
    第 3 条附言  ·  2015-02-10 16:16:54 +08:00
    后面做了这货,https://github.com/restran/web_proxy
    26 条回复    2016-03-13 12:10:28 +08:00
    TONYHEAD
        1
    TONYHEAD  
       2014-11-14 17:30:30 +08:00
    我用二级域名的方法,一个二级域名对应一个目标网站。

    http://0zv.net/
    chinvo
        2
    chinvo  
       2014-11-14 17:32:56 +08:00
    nginx 貌似就能實現吧……
    restran
        3
    restran  
    OP
       2014-11-14 17:33:24 +08:00
    @TONYHEAD 二级域名方法可行,但是现在我没办法用到二级域名。为了尽量对后端的网站程序灵活,都是约束为相对地址,尽量不在链接地址前面加上前缀。这样以后部署到一个域名下面如site_a.com,也可以正常访问,不用改代码。
    restran
        4
    restran  
    OP
       2014-11-14 17:35:44 +08:00
    @chinvo 那说说呗,求分享。困扰我的是怎么处理页面中相对地址的问题。
    chinvo
        5
    chinvo  
       2014-11-14 17:39:01 +08:00
    等等……nginx 貌似沒法實現頁面鏈接的重寫
    0x142857
        6
    0x142857  
       2014-11-14 17:58:49 +08:00 via Android
    @chinvo 当然可以。
    restran
        7
    restran  
    OP
       2014-11-14 18:00:37 +08:00
    @0x142857 求分享。
    0x142857
        8
    0x142857  
       2014-11-14 18:05:42 +08:00   ❤️ 1
    subs_filter ?
    restran
        9
    restran  
    OP
       2014-11-14 19:57:27 +08:00
    @0x142857 就是用方法3,重写页面中的链接地址吧
    0x142857
        10
    0x142857  
       2014-11-14 19:59:41 +08:00
    你可以直接匹配或正则匹配 /static/img.png 替换
    restran
        11
    restran  
    OP
       2014-11-14 20:03:25 +08:00
    @0x142857 那我也可以直接在自己开发的代理程序里面做替换,好像效果是一样的,不知道性能有没有差。
    abelyao
        12
    abelyao  
       2014-11-14 23:09:59 +08:00
    楼主能否说一下如何反向代理一个网站,PHP 虚拟主机行不行?还是需要一个 VPS 呢?
    有没有现成的方案?
    restran
        13
    restran  
    OP
       2014-11-14 23:26:05 +08:00
    @abelyao 可以用nginx,现在我也还在研究如何能完全的做到反向代理。
    restran
        14
    restran  
    OP
       2014-11-14 23:32:21 +08:00
    @0x142857 这个方法感觉不靠谱,不仅可能替换错,而且还很容易遗漏。
    0x142857
        15
    0x142857  
       2014-11-15 00:08:02 +08:00
    基本不会出什么错 :)
    msg7086
        16
    msg7086  
       2014-11-15 07:58:58 +08:00
    为什么不检查referer?
    restran
        17
    restran  
    OP
       2014-11-15 08:09:41 +08:00 via Android
    @msg7086 检查referer的目的是什么?
    rrfeng
        18
    rrfeng  
       2014-11-15 10:07:04 +08:00
    这个开发上就有问题,没得解……
    chinvo
        19
    chinvo  
       2014-11-15 11:33:49 +08:00
    @0x142857 nginx 有可以對頁面進行改變的模塊?
    restran
        20
    restran  
    OP
       2014-11-15 11:53:23 +08:00 via Android
    @chinvo subs_filter 可以对页面的内容进行替换,也就是字符串替换,但这样做并不完美,因为可能有些内容我们本不想替换,也会给替换掉。
    chinvo
        21
    chinvo  
       2014-11-15 13:07:24 +08:00
    @restran 嘗試下 nginx ngx_lua 呢?
    msg7086
        22
    msg7086  
       2014-11-15 15:01:21 +08:00
    @restran 通过referer中的目录地址来确定来源站点,然后根据referer来rewrite sub path
    restran
        23
    restran  
    OP
       2014-11-15 23:04:17 +08:00 via Android
    @msg7086 这个方法可行,我的方法一,也是类似的方法,但是会不会导致页面中所有静态文件链接都要重定向,影响性能?
    restran
        24
    restran  
    OP
       2014-11-15 23:11:23 +08:00 via Android
    @chinvo 是用lua写自定义的转发规则吧,但是最好能在URL上就能直接体现出是访问后端哪个站,这样把URL复制给别人,别人照样能访问。
    sisiww
        25
    sisiww  
       2016-03-11 14:13:56 +08:00
    如何实现一个域名很多对应(二级域名)同时代理多个后端的网站(后端网站很多,域名又是不定的)
    如访问前端二级域名 1.abc.com 对应后端反代的网站是 www.1.com
    访问 2.abc.com 对应后端反代的网站是 www.2.com 访问*.abc.com 对应后端反代的网站是 www.*.com
    这种情况下如何配置.conf 文件
    restran
        26
    restran  
    OP
       2016-03-13 12:10:28 +08:00
    @sisiww 根据 Headers 中的 Host 可以知道请求的域名是多少,然后再根据自己的规则来映射。这个需求应该可以直接在 Nginx 中反代就能完成。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2200 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:25 · PVG 09:25 · LAX 17:25 · JFK 20:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.