V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
scriptB0y
V2EX  ›  问与答

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

  •  3
     
  •   scriptB0y · May 15, 2017 · 8966 views
    This topic created in 3271 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

    求解惑…………

    我看过的资料:

    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 replies    2017-05-15 17:26:57 +08:00
    dandycheung
        1
    dandycheung  
       May 15, 2017 via Android   ❤️ 1
    正向代理是以客户端的身份去申请远程服务,更像是用户,反向代理一般是居于服务器的前端,对用户来说看起来就是服务本身。
    jasontse
        2
    jasontse  
       May 15, 2017 via iPad   ❤️ 4
    正向代理是客户端配置,反向代理是服务器端配置。
    scriptB0y
        3
    scriptB0y  
    OP
       May 15, 2017
    @dandycheung
    听起来反向代理就是服务器的正向代理…… 因为把服务器的 response 发送给客户了……
    scriptB0y
        4
    scriptB0y  
    OP
       May 15, 2017
    @jasontse 所以只是概念的区别,本质上并没有区别? 都是代理
    jasontse
        5
    jasontse  
       May 15, 2017 via iPad   ❤️ 1
    @scriptB0y 正向代理可以访问 Google,反向代理只能访问特定网址。
    scriptB0y
        6
    scriptB0y  
    OP
       May 15, 2017
    @jasontse 理解了。
    chairuosen
        7
    chairuosen  
       May 15, 2017   ❤️ 2
    正向代理,代理相当于一个透明的中间件 a,你访问任何网站 ABCDE 都走这个中间件 a,但在你看来,你访问的永远都是 ABCDE,而不是 a。
    反向代理,固定 a 为 A 的反向代理,唯一,访问 a 相当于访问 A,访问不到 BCDE,同时在你看来,你访问的不是 A 而是 a,你甚至不知道 A 的存在。
    maikcn
        8
    maikcn  
       May 15, 2017   ❤️ 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  
       May 15, 2017
    我滴妈,这两张图虽然不完全准确,但是区别如此明显,说出了精髓,你居然说 “这两幅图完全一样啊” ???黑人问号。。。
    请注意,图里的背景蓝色的 LAN 是很重要的!如果你忽视了这个,说完全一样,那。。。
    qianguozheng
        10
    qianguozheng  
       May 15, 2017   ❤️ 4
    再给你添一把火,透明代理。 哈哈

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

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

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

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

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

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

    它们都是代理(容器)

    不知道够不够准确😶
    tony1016
        19
    tony1016  
       May 15, 2017
    直观一点:
    正向代理,就是你要在浏览器设置代理服务器,然后就能上网了
    反向代理,就是你访问不了谷歌,但是你可以访问我的网站,https://so.tonylee.name,我的服务器帮你把谷歌抓过来供你使用
    scriptB0y
        20
    scriptB0y  
    OP
       May 15, 2017
    @tony1016 你的站好快……
    D3EP
        21
    D3EP  
       May 15, 2017 via Android
    正向代理是为你服务的,反向代理是为服务器服务的。
    tony1016
        22
    tony1016  
       May 15, 2017
    @scriptB0y 大家应该都转向 GCE 平台了吧,反正免费,不用白不用
    tony1016
        23
    tony1016  
       May 15, 2017
    @scriptB0y 呀,你一说,我一看,原来是被 GFW 认证了
    Showfom
        24
    Showfom  
    PRO
       May 15, 2017 via iPhone
    然而反向代理稍作修改也是可以访问任何网站的 嘿嘿
    huangmingyou
        25
    huangmingyou  
       May 15, 2017
    比如访问 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  
       May 15, 2017
    补充一下,正向代理,浏览器知道代理服务器的存在,所以在 http 请求头里面的 url 会加上域名。 上面说的 http 请求头,是浏览器发出的。
    imn1
        27
    imn1  
       May 15, 2017
    这幅图两个互换比较容易理解,阴影部分也挪动

    正向之外应该是多个 server,反向之外是一个 server
    crossoverJie
        28
    crossoverJie  
       May 15, 2017
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5706 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 03:35 · PVG 11:35 · LAX 20:35 · JFK 23:35
    ♥ Do have faith in what you're doing.