首頁 >後端開發 >php教程 >了解正向代理與反向代理的差異

了解正向代理與反向代理的差異

jacklove
jacklove原創
2018-06-11 10:49:243565瀏覽

正向代理的概念

正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,
簡單的說,
我是一個使用者,我訪問不了某網站,但是我能訪問一個代理伺服器
這個代理伺服器呢,他能訪問那個我不能訪問的網站
於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容
代理伺服器去取回,然後返回給我

從網站的角度,只在代理伺服器來取內容的時候有一次記錄
有時並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站

結論就是正向代理是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理程式發送一個請求並指定目標(原始伺服器),然後代理程式向原始伺服器轉交請求並將獲得的內容傳回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。
啟用Apache代理模組

a2enmod proxy
a2enmod proxy_http

設定正向代理程式很簡單,只需要在瀏覽器的Proxy選項裡加入你的Apache配置的vHost主機即可1.1 Apache配置httpd-vhosts.conf(以Windows下為例)

367e5423ee61f30ef297d66282a28f6f
    ServerAdmin prograsliu@gmail.com
    DocumentRoot "D:/www/test"
    ServerName www.test.com
    ServerAlias test.com
    ErrorLog "logs/test.com-error.log"
    CustomLog "logs/test.com-access.log" common    
    Alias /sublook "D:/www/test/look/sublook/"
    18d4f33c18dc818d2362eebe2c1a9e11
        Options FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    bb15ed4aadeed04b3991578461de0768
    
    #正向代理设置
    ProxyRequests On
    ProxyVia On
    7d9fcec3554cc595fd40d709276976ea
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    248646610573c6b250290f263ba4c0b4
ee672f0beb03b42be69279368a66a410

現在看正向代理設定那一段
ProxyRequests On:開啟Apache正向代理
ProxyVia On:控制位於代理伺服器鏈中的代理請求的流向
引用Apache2.2官方文件中對ProxyVia的解釋如下:
1.如果設定為預設值Off ,將不會採取特殊的處理。如果一個請求或應答包含"Via:"頭,將不進行任何修改而直接通過。
2.如果設定為On每個請求和應答都會對應目前主機得到一個"Via:"頭。
3.如果設定為Full ,每個產生的"Via:"頭中都會額外加入Apache伺服器的版本,以"Via:"註解網域出現。
4.如果設定為Block ,每個代理請求中的所有"Via:"頭行都將被刪除。且不會產生新的"Via:"頭。
6ee15aaa635d127fa1757e7ffe9b4b24...248646610573c6b250290f263ba4c0b4:用來控制誰可以訪問你的代理

7d9fcec3554cc595fd40d709276976ea
     Order deny,allow
    Deny from all
     Allow from 127.0.0.1
248646610573c6b250290f263ba4c0b4

此處設定為本機可以使用代理,真正使用的時候就自己設定了
1.2 瀏覽器設定(以FireFox為例)

##1.3 存取效果
訪問www.sina.com,觀察HTTP請求Response:


#可以看到,Via:www.test.com,正向代理成功了。

反向代理的概念

繼續範例:

範例使用者造訪http://test.me/readme
但test. me上並不存在readme頁面
他是偷偷從另外一台伺服器上取回,然後作為自己的內容吐給用戶

但用戶並不知情

這裡所提到的test.me 這個網域對應的伺服器就設定了反向代理功能

结论就是 反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。

2.1 Apache设置

<VirtualHost *:80>
     ServerAdmin prograsliu@gmail.com
     DocumentRoot "D:/www/test"
     ServerName www.test.com
     ServerAlias test.com
     ErrorLog "logs/test.com-error.log"
     CustomLog "logs/test.com-access.log" common    
     Alias /sublook "D:/www/test/look/sublook/"
     <Directory "D:/www/test">
         Options FollowSymLinks
         AllowOverride All
         Order allow,deny
         Allow from all
     </Directory>
     
     #反向代理设置
     ProxyPass /proxy http://www.proxypass.com/proxy
     ProxyPassReverse /proxy http://www.proxypass.com/proxy
 
 </VirtualHost>
 
 <VirtualHost *:80>
     ServerAdmin prograsliu@gmail.com
     DocumentRoot "D:/www/proxypass"
     ServerName www.proxypass.com
     ServerAlias proxypass.com
     <Directory "D:/www/proxypass">
         Options FollowSymLinks
         AllowOverride All
         Order allow,deny
         Allow from all
     </Directory>
 </VirtualHost>

现在看反向代理设置那一段
ProxyPass /proxy http://www.proxypass.com/proxy : 将 www.test.com/proxy 域下的所有请求转发给 www.proxypass.com/proxy 代理,例如 www.test.com/proxy/login.php 会交给 www.proxypass.com/proxy/login.php 代理
ProxyPassReverse /proxy http://www.proxypass.com/proxy :
www.proxypass.com/proxy/login.php 中有如下代码:

<?php
    header(&#39;Location: http://www.proxypass.com/proxy/result.php&#39;);
?>

那么在重定向的时候,Apache会将HTTP请求重新设为 http://www.test.com/proxy/result.php, 这样的作用稍后讲解
www.proxypass.com/proxy/result.php 中有如下代码:

<?php
    echo &#39;in proxypass.com <br>&#39;;
?>

2.2 浏览器访问效果
访问 www.test.com/proxy/login.php
Apache将请求交给 www.proxypass.com/proxy/login.php 代理,HTTP请求如图:

可以发现其实Request中的请求还是 www.test.com 的,但是它确实是由 www.proxypass.com 来处理的

proxypass.com/proxy/login.php 重定向到 proxypass.com/proxy/result.php
页面显示 in proxypass.com
HTTP请求如图:



也可以看到请求依然是 www.test.com/proxy/result.php

这里就是 ProxyPassReverse 发挥作用的地方,如果不加这个项,重定向后HTTP请求会如下图:


可以发现请求中的GET是 www.proxypass.com 而不是 www.test.com ,这是因为配置了ProxyPassReverse后,proxypass.com/proxy/login.php 在重定向到 proxypass.com/proxy/result.php 时,Apache会将它调整回 test.com/proxy/result.php , 然后Apache再将 test.com/proxy/result.php 代理给 proxypass.com/proxy/result.php,所以说配置了 ProxyPassReverse 后,即使 proxypass.com/proxy 下的程序有重定向到其他 proxypss.com/proxy 的文件的(如 login.php 重定向到 result.php),你也不会在请求中发现 proxypass.com 的影子。

两者区别

用途上来讲:

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理还可以使用缓冲特性减少网络使用率。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。

另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

安全性 來講:

正向代理程式允許客戶端透過它存取任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅為經過授權的客戶端提供服務。

反向代理對外都是透明的,訪客並不知道自己存取的是一個代理。

本文說明了正向代理與反向代理的區別,更多相關內容請關注php中文網。

相關推薦:

如何使用Apache 建立虛擬主機

如何透過sh memcached 進程啟動及監控

介紹自動登入google play下載app report 的相關內容

以上是了解正向代理與反向代理的差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn