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

反向代理和正向代理的区别到底是什么?

  •  3
     
  •   scriptB0y · 2017-05-15 10:21:34 +08:00 · 8186 次点击
    这是一个创建于 2734 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在网上看了很多资料,还是不理解反向代理与正向代理的区别,感觉就是客户端发请求给代理,代理将服务器相应转发回来。

    网上用的很多的是这种类似的图:

    但是仔细想想,这两幅图完全一样啊,并没有看出来是“反向”还是“正向”的区别。

    那我反向代理也可以说成,客户端不知道服务器地址,发请求给代理,代理去访问服务器,这不就成正向了?

    正向代理也可以说成,服务器无法收到客户端请求,于是使用一台代理服务器帮助接收客户端请求,再转发回来,那这不成反向了?

    我理解的不同只有这一点:两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。

    求解惑…………

    我看过的资料:

    1. http://www.jianshu.com/p/208c02c9dd1d
    2. https://www.zhihu.com/question/24723688
    3. http://z00w00.blog.51cto.com/515114/1031287
    4. https://github.com/moonbingbing/openresty-best-practices/blob/master/ngx/reverse_proxy.md
    28 条回复    2017-05-15 17:26:57 +08:00
    dandycheung
        1
    dandycheung  
       2017-05-15 10:27:51 +08:00 via Android   ❤️ 1
    正向代理是以客户端的身份去申请远程服务,更像是用户,反向代理一般是居于服务器的前端,对用户来说看起来就是服务本身。
    jasontse
        2
    jasontse  
       2017-05-15 10:29:47 +08:00 via iPad   ❤️ 4
    正向代理是客户端配置,反向代理是服务器端配置。
    scriptB0y
        3
    scriptB0y  
    OP
       2017-05-15 10:31:16 +08:00
    @dandycheung
    听起来反向代理就是服务器的正向代理…… 因为把服务器的 response 发送给客户了……
    scriptB0y
        4
    scriptB0y  
    OP
       2017-05-15 10:31:53 +08:00
    @jasontse 所以只是概念的区别,本质上并没有区别? 都是代理
    jasontse
        5
    jasontse  
       2017-05-15 10:36:17 +08:00 via iPad   ❤️ 1
    @scriptB0y 正向代理可以访问 Google,反向代理只能访问特定网址。
    scriptB0y
        6
    scriptB0y  
    OP
       2017-05-15 10:40:36 +08:00
    @jasontse 理解了。
    chairuosen
        7
    chairuosen  
       2017-05-15 10:45:14 +08:00   ❤️ 2
    正向代理,代理相当于一个透明的中间件 a,你访问任何网站 ABCDE 都走这个中间件 a,但在你看来,你访问的永远都是 ABCDE,而不是 a。
    反向代理,固定 a 为 A 的反向代理,唯一,访问 a 相当于访问 A,访问不到 BCDE,同时在你看来,你访问的不是 A 而是 a,你甚至不知道 A 的存在。
    maikcn
        8
    maikcn  
       2017-05-15 10:46:16 +08:00   ❤️ 2
    代理的概念是一样的,就是你不能直接访问为你提供服务的那台服务器,需要有个中间人(代理)来帮你转达你的请求,或者服务器返回的信息。

    从使用者的角度来说,

    [正向代理] 就是你明知道你无法直接访问服务器 A,需要找个服务,来让你能迂回的访问到服务器 A。比如你明明知道 Google 打不开,然后想要打开的时候,你用的服务对你来说就是正向代理。

    [反向代理] 就是你需要访问一个服务,比如百度,你知道访问 baidu.com,也知道对应的 ip 是 14.215.177.37,但百度可能是用到内部的一个服务器 ip 192.168.0.2 来接受搜索的请求并返回结果,只是通过 14.215.177.37 这个 ip 跟你进行交互,14.215.177.37 这个 ip 不提供搜索的服务,这个过程中的 14.215.177.37 就是反向代理了。而使用者在这个过程中是完全无感的。
    Citrus
        9
    Citrus  
       2017-05-15 10:52:59 +08:00
    我滴妈,这两张图虽然不完全准确,但是区别如此明显,说出了精髓,你居然说 “这两幅图完全一样啊” ???黑人问号。。。
    请注意,图里的背景蓝色的 LAN 是很重要的!如果你忽视了这个,说完全一样,那。。。
    qianguozheng
        10
    qianguozheng  
       2017-05-15 11:16:30 +08:00   ❤️ 4
    再给你添一把火,透明代理。 哈哈

    正向代理-- 我代理帮我干活。(你发出去的 http 请求是完整的 url,由代理生成 http 请求头)
    反向代理-- 我不知道帮我干活的是代理。(服务器自己的负载均衡服务器调度,你不用管)
    透明代理-- 我不知道他帮我干了活(著名的劫持, 重组 http 请求)
    bukip
        11
    bukip  
       2017-05-15 11:33:53 +08:00   ❤️ 1
    正向代理:
    你的机器 -> proxy -> 广阔天地

    反向代理:
    你的机器 <- proxy <- 某个网站
    BlackCat02
        12
    BlackCat02  
       2017-05-15 11:57:24 +08:00
    @Citrus +1。。。这图简直不能再明确
    BlackCat02
        13
    BlackCat02  
       2017-05-15 11:58:22 +08:00
    @scriptB0y 本质都是计算机软件
    Clarencep
        14
    Clarencep  
       2017-05-15 12:03:05 +08:00   ❤️ 1
    @Citrus +1

    不过,正向代理也可以不部署在 LAN 内;反向代理也可以代理 LAN 外的服务器(比如代理 google 的各种网站)。

    我觉得正向 /反向的主要区别在于代理服务器是专门为 Client/Server 服务的。
    mooncakejs
        15
    mooncakejs  
       2017-05-15 12:20:28 +08:00 via iPhone   ❤️ 1
    正在代理需要知道服务器地址。 反向代理需要知道后端服务器真实的地址
    libook
        16
    libook  
       2017-05-15 12:39:38 +08:00 via Android   ❤️ 1
    发起连接的方向有关;出去的是正向,进来的是反向。正反是人为定义的吧。
    科学上网用的代理服务器,发起网络请求的连接是由内而外,正向。
    服务器用的 nginx,发起网络请求的连接是由外而内的,反向。
    Citrus
        17
    Citrus  
       2017-05-15 12:47:33 +08:00
    @Clarencep 对,所以我说这图有些小问题。但是这些问题不大,只是不常用的用法。最常见的场景这张图已经画的非常好了。
    MrFireAwayH
        18
    MrFireAwayH  
       2017-05-15 12:53:47 +08:00 via Android   ❤️ 1
    接地气点的来一个

    正向代理 你的杯子装了水 你也可以装其他东西比如 Dr.Pepper

    反向代理 你开了罐 Dr.Pepper 所以只能喝 Dr.Pepper

    它们都是代理(容器)

    不知道够不够准确😶
    tony1016
        19
    tony1016  
       2017-05-15 13:06:23 +08:00
    直观一点:
    正向代理,就是你要在浏览器设置代理服务器,然后就能上网了
    反向代理,就是你访问不了谷歌,但是你可以访问我的网站,https://so.tonylee.name,我的服务器帮你把谷歌抓过来供你使用
    scriptB0y
        20
    scriptB0y  
    OP
       2017-05-15 13:30:44 +08:00
    @tony1016 你的站好快……
    D3EP
        21
    D3EP  
       2017-05-15 13:40:04 +08:00 via Android
    正向代理是为你服务的,反向代理是为服务器服务的。
    tony1016
        22
    tony1016  
       2017-05-15 13:42:33 +08:00
    @scriptB0y 大家应该都转向 GCE 平台了吧,反正免费,不用白不用
    tony1016
        23
    tony1016  
       2017-05-15 13:53:09 +08:00
    @scriptB0y 呀,你一说,我一看,原来是被 GFW 认证了
    Showfom
        24
    Showfom  
       2017-05-15 15:01:47 +08:00 via iPhone
    然而反向代理稍作修改也是可以访问任何网站的 嘿嘿
    huangmingyou
        25
    huangmingyou  
       2017-05-15 16:37:49 +08:00
    比如访问 www.vphotos.cn/index.html
    正向代理: http 请求头里面的 url 是 http://www.vphotos.cn/index.html

    反向代理: http 请求头里面的 url 是 /index.html

    没有任何代理: http 请求头 url 是 /index.html

    正向代理的 url 加了 www.vphotos.cn 是需要告诉代理服务器,目标 web 服务器的主机名,如果不这么写,代理服务器不知道怎么取内容。

    但是反向的代理服务器,对客户端来说是透明的。 反向代理服务器,只针对特定的域名提供服务。 而正向的代理,通常是能代理所有域名。
    huangmingyou
        26
    huangmingyou  
       2017-05-15 16:39:43 +08:00
    补充一下,正向代理,浏览器知道代理服务器的存在,所以在 http 请求头里面的 url 会加上域名。 上面说的 http 请求头,是浏览器发出的。
    imn1
        27
    imn1  
       2017-05-15 16:50:27 +08:00
    这幅图两个互换比较容易理解,阴影部分也挪动

    正向之外应该是多个 server,反向之外是一个 server
    crossoverJie
        28
    crossoverJie  
       2017-05-15 17:26:57 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:13 · PVG 03:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.