導航:首頁 > 編程語言 > php網站空間反向代理

php網站空間反向代理

發布時間:2023-05-15 06:51:19

『壹』 伺服器正向代理和反向代理

正向代理,也就是傳說中的代理,他的工作原理就像一個跳板。簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理伺服器,這個代理伺服器呢,他能訪問那個我不能訪問的網站,於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容,代理伺服器去取回來,然後返回給我。從網站的角度,只在代理伺服器來取內容的時候有一次記錄。結論就是,正向代理,是一個位於客戶端和原始伺服器(origin

server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理發送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
反向代理.舉例:
例用戶訪問 http://ooxx/readme 但ooxx上並不存在readme頁面他是偷偷從另外一台伺服器上取回來,然後作為自己肢伏的內容吐給用戶
但用戶並不知情這很正常,用戶一般都很笨
這里所提到的 ooxx這個域名對應的伺服器畢飢棚就設置了反向代理功能
結論就是
反向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理
的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容
原本就是它自己的一樣。
正向代理和反向代理的區別,從用途上來講:
正向代理的典型用途是為在防火牆內的區域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性減少網路使用率。反向代理的典型用途是將
防火牆後面的伺服器提供給Internet用戶訪問。反向代理還可以為後端的多台伺服器提供負載平衡,或為後端較慢的伺服器提供緩沖服務。
另外,反手則向代理還可以啟用高級URL策略和管理技術,從而使處於不同web伺服器系統的web頁面同時存在於同一個URL空間下。
從安全性來講:
正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅為經過授權的客戶端提供服務。
反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
開放的反向代理應用:nginx和nat123。nginx是單純的反向代理,需要自行搭建反向代理服務才能使用,效率高。nat123是結合了NAT和反向代理的應用,可以直接使用,解決80埠問題等,速度快。

總而言之,梯子的原理就是正向代理,負載均衡的原理就是反向代理。

『貳』 php利用Nginx如何實現反向代理

『叄』 如何利用php獲取url反向代理後面的真實地址

下面的代碼用於獲得真實的客戶端ip,俗話說,道高一尺魔高一丈,更高級的偽裝能夠騙過這種檢測也有可能,不過至少讓偽裝的門檻提高不少。

function getip() {

$unknown = 'unknown';

if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

} elseif ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {

$ip = $_SERVER['REMOTE_ADDR'];

}

/*

處理多層代理的情況

或者使用正則方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;

*/

if (false !== strpos($ip, ','))

$ip = reset(explode(',', $ip));

return $ip;

}
需要做下簡單解釋:
一、沒有使用代理伺服器的PHP獲取客戶端IP情況:
REMOTE_ADDR = 客戶端IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
二、使用透明代理伺服器的情況:Transparent Proxies
REMOTE_ADDR = 最後一個代理伺服器 IP
HTTP_X_FORWARDED_FOR = 客戶端真實 IP (經過多個代理伺服器時,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)
這類代理伺服器還是將客戶端真實的IP發送給了訪問對象,無法達到隱藏真實身份的目的.
三、使用普通匿名代理伺服器的PHP獲取客戶端IP情況:Anonymous Proxies
REMOTE_ADDR = 最後一個代理伺服器 IP
HTTP_X_FORWARDED_FOR = 代理伺服器 IP (經過多個代理伺服器時,這個值類似:203.98.182.163, 203.98.182.163, 203.129.72.215)
這種情況下隱藏了客戶端的真實IP,但是向訪問對象透露了客戶端是使用代理伺服器訪問它們的.
四、使用欺騙性代理伺服器的情況:Distorting Proxies
REMOTE_ADDR = 代理伺服器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP(經過多個代理伺服器時,這個值類似:220.4.251.159, 203.98.182.163, 203.129.72.215)
這種情況下同樣透露了客戶端是使用了代理伺服器,但編造了一個虛假的隨機IP(220.4.251.159)代替客戶端的真實IP來欺騙它.
五、使用高匿名代理伺服器的PHP獲取客戶端IP情況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理伺服器 IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
無論是REMOTE_ADDR還是HTTP_FORWARDED_FOR,這些頭消息未必能夠取得到,因為不同的瀏覽器不同的網路設備可能發送不同的IP頭消息.因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 獲取的值可能是空值也可能是「unknown」值.

『肆』 使用thinkphp 怎麼實現反向代理

改自PHP Reverse Proxy PRP,修改了原版中的一些錯誤,支持了文件上傳以及上傳文件類型識別,支持指定IP,自適應SAE環境。
使用方法
?123456789 <?php $proxy=new PhpReverseProxy(); $proxy->port="8080"; $proxy->host="ww"; //$proxy->ip="1.1.1.1"; $proxy->forward_path=""; $proxy->connect(); $proxy->output(); ?>
源代碼
<?php //Source Code: http //www xiumu.org/technology/php-reverse-proxy-class.shtml class PhpReverseProxy{ public $publicBaseURL; public $outsideHeaders; public $XRequestedWith; public $sendPost; public $port,$host,$ip,$content,$forward_path,$content_type,$user_agent, $XFF,$request_method,$IMS,$cacheTime,$cookie,$authorization; private $http_code,$lastModified,$version,$resultHeader; const chunkSize = 10000; function __construct(){ $this->version="PHP Reverse Proxy (PRP) 1.0"; $this->port="8080"; $this->host="127.0.0.1"; $this->ip=""; $this->content=""; $this->forward_path=""; $this->path=""; $this->content_type=""; $this->user_agent=""; $this->http_code=""; $this->XFF=""; $this->request_method="GET"; $this->IMS=false; $this->cacheTime=72000; $this->lastModified=gmdate("D, d M Y H:i:s",time()-72000)." GMT"; $this->cookie=""; $this->XRequestedWith = ""; $this->authorization = ""; } function translateURL($serverName) { $this->path=$this->forward_path.$_SERVER['REQUEST_URI']; if(IS_SAE) return $this->translateServer($serverName).$this->path; if($_SERVER['QUERY_STRING']=="") return $this->translateServer($serverName).$this->path; else return $this->translateServer($serverName).$this->path."?".$_SERVER['QUERY_STRING']; } function translateServer($serverName) { $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; $protocol = $this->left(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; if($this->port=="") return $protocol."://".$serverName; else return $protocol."://".$serverName.":".$this->port; } function left($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); } function preConnect(){ $this->user_agent=$_SERVER['HTTP_USER_AGENT']; $this->request_method=$_SERVER['REQUEST_METHOD']; $tempCookie=""; foreach ($_COOKIE as $i => $value) { $tempCookie=$tempCookie." $i=$_COOKIE[$i];"; } $this->cookie=$tempCookie; if(empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $this->XFF=$_SERVER['REMOTE_ADDR']; } else { $this->XFF=$_SERVER['HTTP_X_FORWARDED_FOR'].", ".$_SERVER['REMOTE_ADDR']; } } function connect(){ if(empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])){ $this->preConnect(); $ch=curl_init(); if($this->request_method=="POST"){ curl_setopt($ch, CURLOPT_POST,1); $postData = array(); $filePost = false; $uploadPath = 'uploads/'; if (IS_SAE) $uploadPath = SAE_TMP_PATH; if(count($_FILES)>0){ if(!is_writable($uploadPath)){ die('You cannot upload to the specified directory, please CHMOD it to 777.'); } foreach($_FILES as $key => $fileArray){ ($fileArray["tmp_name"], $uploadPath . $fileArray["name"]); $proxyLocation = "@" . $uploadPath . $fileArray["name"] . ";type=" . $fileArray["type"]; $postData = array($key => $proxyLocation); $filePost = true; } } foreach($_POST as $key => $value){ if(!is_array($value)){ $postData[$key] = $value; } else{ $postData[$key] = serialize($value); } } if(!$filePost){ //$postData = http_build_query($postData); $postString = ""; $firstLoop = true; foreach($postData as $key => $value){ $parameterItem = urlencode($key)."=".urlencode($value); if($firstLoop){ $postString .= $parameterItem; } else{ $postString .= "&".$parameterItem; } $firstLoop = false; } $postData = $postString; } //echo print_r($postData); //curl_setopt($ch, CURLOPT_VERBOSE, 0); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); $this->sendPost = $postData; //var_mp(file_exists(str_replace('@','',$postData['imgfile'])));exit; curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); //curl_setopt($ch, CURLOPT_POSTFIELDS,file_get_contents($proxyLocation)); //curl_setopt($ch, CURLOPT_POSTFIELDS,file_get_contents("php://input")); } //gets rid of mulitple ? in URL $translateURL = $this->translateURL(($this->ip)?$this->ip:$this->host); if(substr_count($translateURL, "?")>1){ $firstPos = strpos($translateURL, "?", 0); $secondPos = strpos($translateURL, "?", $firstPos + 1); $translateURL = substr($translateURL, 0, $secondPos); } curl_setopt($ch,CURLOPT_URL,$translateURL); $proxyHeaders = array( "X-Forwarded-For: ".$this->XFF, "User-Agent: ".$this->user_agent, "Host: ".$this->host ); if(strlen($this->XRequestedWith)>1){ $proxyHeaders[] = "X-Requested-With: ".$this->XRequestedWith; //echo print_r($proxyHeaders); } curl_setopt($ch,CURLOPT_HTTPHEADER, $proxyHeaders); if($this->cookie!=""){ curl_setopt($ch,CURLOPT_COOKIE,$this->cookie); } curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false); curl_setopt($ch,CURLOPT_AUTOREFERER,true); curl_setopt($ch,CURLOPT_HEADER,true); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); $output=curl_exec($ch); $info = curl_getinfo( $ch ); curl_close($ch); $this->postConnect($info,$output); }else { $this->lastModified=$_SERVER['HTTP_IF_MODIFIED_SINCE']; $this->IMS=true; } } function postConnect($info,$output){ $this->content_type=$info["content_type"]; $this->http_code=$info['http_code']; //var_mp($info);exit; if(!empty($info['last_modified'])){ $this->lastModified=$info['last_modified']; } $this->resultHeader=substr($output,0,$info['header_size']); $content = substr($output,$info['header_size']); if($this->http_code=='200'){ $this->content=$content; }elseif( ($this->http_code=='302' || $this->http_code=='301') && isset($info['redirect_url'])){ $redirect_url = str_replace($this->host,$_SERVER['HTTP_HOST'],$info['redirect_url']); if (IS_SAE) $redirect_url = str_replace('http://fetchurl.sae.sina.com.cn/','',$info['redirect_url']); header("Location: $redirect_url"); exit; }elseif($this->http_code=='404'){ header("HTTP/1.1 404 Not Found"); exit("HTTP/1.1 404 Not Found"); }elseif($this->http_code=='500'){ header('HTTP/1.1 500 Internal Server Error'); exit("HTTP/1.1 500 Internal Server Error"); }else{ exit("HTTP/1.1 ".$this->http_code." Internal Server Error"); } } function output(){ $currentTimeString=gmdate("D, d M Y H:i:s",time()); $expiredTime=gmdate("D, d M Y H:i:s",(time()+$this->cacheTime)); $doOriginalHeaders = true; if($doOriginalHeaders){ if($this->IMS){ header("HTTP/1.1 304 Not Modified"); header("Date: Wed, $currentTimeString GMT"); header("Last-Modified: $this->lastModified"); header("Server: $this->version"); }else{ header("HTTP/1.1 200 OK"); header("Date: Wed, $currentTimeString GMT"); header("Content-Type: ".$this->content_type); header("Last-Modified: $this->lastModified"); header("Cache-Control: max-age=$this->cacheTime"); header("Expires: $expiredTime GMT"); header("Server: $this->version"); preg_match("/Set-Cookie:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ header($result[$i]); } preg_match("/Content-Encoding:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ //header($result[$i]); } preg_match("/Transfer-Encoding:[^\n]*/i",$this->resultHeader,$result); foreach($result as $i=>$value){ //header($result[$i]); } echo($this->content); /* if(stristr($this->content, "error")){ echo print_r($this->sendPost); } */ } } else{ $headerString = $this->resultHeader; //string $headerArray = explode("\n", $headerString); foreach($headerArray as $privHeader){ header($privHeader); } if(stristr($headerString, "Transfer-encoding: chunked")){ flush(); ob_flush(); $i = 0; $maxLen = strlen($this->content); while($i < $maxLen){ $endChar = $i + self::chunkSize; if($endChar >= $maxLen){ $endChar = $maxLen - 1; } $chunk = substr($this->content, $i, $endChar); $this->mp_chunk($chunk); flush(); ob_flush(); $i = $i + $endChar; } } else{ echo($this->content); } //echo "header: ".print_r($headerArray); //header($this->resultHeader); } } function mp_chunk($chunk) { echo sprintf("%x\r\n", strlen($chunk)); echo $chunk; echo "\r\n"; } function getOutsideHeaders(){ $headers = array(); foreach ($_SERVER as $name => $value){ if (substr($name, 0, 5) == 'HTTP_') { $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))); $headers[$name] = $value; }elseif ($name == "CONTENT_TYPE") { $headers["Content-Type"] = $value; }elseif ($name == "CONTENT_LENGTH") { $headers["Content-Length"] = $value; }elseif(stristr($name, "X-Requested-With")) { $headers["X-Requested-With"] = $value; $this->XRequestedWith = $value; } } //echo print_r($headers); $this->outsideHeaders = $headers; return $headers; } } ?>

『伍』 如何禁止網站被反向代理

在前幾天兩個站點被別人完全境像代理,基本上就是直接讓他給復制過去了,我也是醉了,直接鏡像過去,然後再緩存到他自己的伺服器上面,真是絕了,你自己的站點再加什麼代理去反代理也不管用了,因為他的站點根本就不變,使用了 .htaccess 來反代理,也使用了 js 判斷域名都不管用,所以我一直在判斷他使用了緩存機制,如果不使用緩存,時時代理的話肯定是可以的,我先把這兩種方法來總結一下吧。
一、使用 .htaccess 禁止反向代理
在站點根目錄下新建 .htaccess 文件,然後添加如下的內容:
RewriteEngine On
RewriteBase /
php_value auto_append_file proxy.php
再新建 proxy.php 文件,添加如下代碼保存.
<?php
$f = getenv("HTTP_X_FORWARDED_FOR");
$url = "https://www.xiariboke.com";
if ($f!=""){
print "「;
print 「「;
}
?>
二、使用 js 代碼判斷域名
<script type="text/javascript">
if (document.domain != 'xiariboke.com' && document.domain != 'www.xiariboke.com'){
window.location.href='http://www.xiariboke.com/';
}
</script>
這種是首先判斷他的域名是不是 xiariboke.com 這個域名,如果是則正常訪問,如果不是則跳轉到原網站。
三、使用 php 判斷域名
這種方法跟使用 js 代碼來跳轉域名是一個道理,都是先判斷域名,如果是代理的域名則進行跳轉,代碼如下:
<P><?php </P>
<P>if($_SERVER['SERVER_NAME'] != 'xiariboke.com' ||$_SERVER['SERVER_NAME'] != 'www.xiariboke.com' )
{
exit('非法反向代理訪問');
}</P>
<P>?></P>
如果是時時代理的話,上面三種方法就已經足夠了,但如果他使用了緩存,將代理的網站緩存到他自己的伺服器上面,再使用這些就不管用了,因他被他代理的站都不更新了,你再怎麼改都不行,尤其現在的阿里雲CDN,360CDN又怎麼牛,而我的站點使用的就是阿里雲CDN,上面有個防止外鏈,把防外鏈給開啟才解決。
一般的網站CSS,JS調用基本上用的都是絕對路徑,所以我們可以重命名CSS,JS的文件包以達到對別人境像網站的控制,把他的頁面搞亂,這樣相信堅持不了幾天,他就會換成其它網站了。

『陸』 如何阻止網站被惡意反向代理訪問


最近有人用小站數據,利用反向代理技術,做了個小偷站。用戶訪問的是他的網址,但實質上內容數據確是我的,這是一起惡意反向代理事件
什麼是反向代理?
先說說正向代理的概念:
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板。簡單的說,我是一個用戶,我訪問不了某網站,但是我能訪問一個代理伺服器。這個代理伺服器呢,他源畢能訪問那個我不能訪問的網站,於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容,代理伺服器去取回來,然後返回給我。從網站的角度,只在代理伺服器來取內容的時候有一次記錄,有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。
結論就是,正向代理是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理發送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
那麼反向代理的概念呢?
比如用戶訪問
但用戶並不知情,這很正常,用戶一般都很笨。這里所提到的
這個域名對應的伺服器就設置了反向代理功能。
結論就是反向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理 的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。
惡意反向代理的危害
網站被惡意反向代理有什麼危害呢?這里列舉一下:
首先肯定會佔用伺服器資源,網站打開速度受影響。
其次,別人通過代理盜用你的網站數據,對用戶與不是那麼智能的搜索引擎而言,相當於建了一個與你一模一樣的站點,那麼很有可能你的站點會進搜索引擎沙箱,叢喊甚至被降權。
如果被惡意代理的頁面,還掛有你的聯盟廣告(比如Adsense),這就十分危險了,如果有人點擊了上面的廣告,很容易被Adsense封號。
還有很多危害,讀者可以自行腦補
js 級別的解決方案
代碼如下:
腳本很簡單,如果地址欄中的網址不是

中的任何一個,那麼就把地址欄轉向
題外話:如何防止網站被iframe嵌入。有些人用iframe做了個框架,把我們網站嵌入其中,訪客來瀏覽的時候,好像是在瀏覽他自己的網站一樣雹鄭芹,那麼如何解決呢?以下方法可破:
代碼如下:
php 級別的解決方案
js 級別的解決方案雖然能夠讓惡意代理頁面跳回來,但是對搜索引擎不怎麼友好。下面是伺服器端(PHP)的解決方案,代碼比較簡單,就不多說了。
代碼如下:
$proxy_rs = $this - proxy_filter();
if( $proxy_rs != '' || $proxy_rs != '' )
{
echo '非法反向代理訪問'
//header('Location:
exit;
}
public function proxy_filter()
{
/*
$svrUrl = '
if (!empty($_SERVER["QUERY_STRING"]))
{
$svrUrl .= "?".$_SERVER["QUERY_STRING"];
}
return $svrUrl;
*/
return $_SERVER['SERVER_NAME'];
}
htaccess 級別的解決方案
.htaccess
代碼如下:
RewriteEngine On
RewriteBase /
php_value auto_append_file proxy.php
proxy.php
代碼如下:
$f = getenv("HTTP_X_FORWARDED_FOR");
$server = getenv("HTTP_HOST");
if (($f!="")($server!="")($server!="")){
echo '本伺服器禁止惡意反向代理!'
}
?
這個由於我網站的特殊性,沒試驗過,但是網上常用這種方法。

『柒』 php如何基於squid面向apache反向代理

// 作者: hightman 首次發布於 chinaunix.net PHP 版// // 首先在 php 程序中,確保不要輸出 Expires: HTTP 頭// // 當前 URL結構的最後更新時間,如 BBS 列表的話可以判斷最新發貼時間, // 博客文章可以求出最後發表評論的時間,只要沒有新發表或沒有新評論不 // 必重新運行 php 腳本… $chrono = filemtime(__FILE__); // 使用 apache 提供的函數,獲取 If-Modified-Since $headers = apache_request_headers(); $client_time = (isset($headers['If-Modified-Since']) strtotime($headers['If-Modified-Since']) : 0);// 比較 client_time 與 當前頁面刷新時間 if ($client_time && $client_time = $chrono){ // 表明 squid 的緩存是新的不必從頭運行腳本,簡單通過 HTTP 狀態通知即可 // 發送 ‘304 Not Modified’. 然後退出腳本 header(’Last-Modified: ‘.gmdate(’D, d M Y H:i:s’, $client_time).’ GMT’, true, 304);exit(0);}else{ // 表明該頁面比客戶端提供的更新, 故需要重新運行腳本, 發送 200 狀態

『捌』 apache配置反向代理的問題,求大神指點!

在IIS7之前,在windows上要實現該功能卻不是一件容易的事情,但是在IIS7上,通過Application Request Routing模塊,我們可以輕松實現反向代理
在配置web伺服器的時候,我們經常遇到這樣的問題,由於某些原因,該伺服器只能擁有一個公網IP,但是可能需要提供其他機器或者本機上其他 webserver的伺服器給訪問者,同時又不希望使用其他埠,如果在linux下,常見的解決方案是使用nginx作為前端server,通過反向代 理間接訪問其他webserver.在IIS7之前,在windows上要實現該功能卻不是一件容易的事情,但是在IIS7上,通過 Application Request Routing模塊,我們可以輕松實現反向代理.

本次測試配置的情況,簡單起見,只在 iis中測試,配置3個網站,第一個」LevenWeb」,使用80埠提供服務,第二個」levenblog」,下面運行著 levenblog2.0.9,使用8080埠,第三個」phpweb」,下面有一個」test.php」的phpinfo頁面(iis7 php配置本文不再詳述),本機ip:192.168.1.8,為了測試,我們先進行域名綁定,也就是在leven.com.cn下新增3個子域名,域名 綁定如下圖所示:

我們的目標如下:

http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/

http://levenblog.leven.com.cn/ 訪問levenblog站點,也就是http://localhost:8080/

http://realblog.leven.com.cn/ 訪問公網上的levenblog站點,也就是http://leven.com.cn/

http://localhost/leven 訪問levenblog站點,也就是http://leven.com.cn/

首先前往http://www.iis.net/extensions/ApplicationRequestRouting下載Application Request Routing,然後安裝,本次實踐使用的是V2版.

安裝完畢之後,新建3個站點:

然後找到ARR配置菜單:

開啟Proxy項:

然後在levenweb站點下配置反向代理路由,配置可以使用UI界面或者直接修改web.config的模式,本次配置給出ui和config文件兩種方式,個人更喜歡config配置文件模式.

進入該項,先配置第一項, http://phpweb.leven.com.cn/ 訪問phpweb站點,也就是http://localhost:8081/,選擇」Add Rules...」:

然後選擇」Blank Rule」

然後填寫如下:

圖片看不清楚?請點擊這里查看原圖(大圖)。

該參數設置表面ARR將攔截所有請求

繼續在」Conditions」中選擇」Add」:

該設置表面只有HTTP_HOST為phpweb.leven.com.cn的URL才能通過該規則,如果您綁定了多個域名,可以根據多次增加或者通過正則表達式的|來間隔

最後在下面的Action中配置代理路徑:

圖片看不清楚?請點擊這里查看原圖(大圖)。

在這兒,{R:1}代表了MatchUrl中的第一個匹配括弧

同樣配置的web.config文件如下:
復制代碼 代碼如下:

測試訪問http://phpweb.leven.com.cn/test.php,結果如下:

下面同樣可以配置levenblog.leven.com.cn和realblog.leven.com.cn

Ui界面配置不再說明,配置完成的web.config如下:
復制代碼 代碼如下:

訪問結果分別為:



我們再添加最後一項,將http://localhost/leven 代理到 http://leven.com.cn/
復制代碼 代碼如下:

但是此時訪問會出現問題,如下圖:

顯然,出現了css丟失等情況,通過查看源碼:

可以看到css的路徑有誤,不僅如此,所有的img,a標簽路徑全部出現了錯誤,代理之後的地址是/leven/xxx的,但是源地址仍然是/xxx,因此我們還需要增加一個Outbound Rule

配置好的config文件如下:
復制代碼 代碼如下:

然後刷新:

可見路徑正確.

在使用了反向代理之後,編程上也有些地方需要注意了,在取客戶端IP的時候,由於多了一層代理,直接是無法獲取的,因此,我們需要開啟

然後通過獲取Header中的X-Forworded-For欄位來取得客戶端IP

從測試來看,ARR是個非常有用的代理模塊,能完全滿足我們反向代理的需求,不僅如此,ARR還提供了UrlRewrite,ServerFarms,Cache等很多功能,很是值得我們挖掘.

來源: 博客園 作者:Leven

閱讀全文

與php網站空間反向代理相關的資料

熱點內容
python中的idle 瀏覽:998
五軸聯動數控編程 瀏覽:963
換一台電腦如何遠程雲伺服器 瀏覽:130
阿里雲怎麼買雲伺服器 瀏覽:662
java提取文字 瀏覽:95
阿里雲伺服器同人賬號問題 瀏覽:418
5分鍾解壓軸題 瀏覽:339
安卓桌面二級文件夾 瀏覽:186
eps文檔加密 瀏覽:261
手機怎麼做pdf 瀏覽:162
ug曲面pdf 瀏覽:279
液化氣還是壓縮氣 瀏覽:950
阿里雲公共ntp伺服器地址 瀏覽:991
金字塔學習機編程 瀏覽:684
多邊形掃描線演算法Python 瀏覽:718
快手app快手粉條在哪裡 瀏覽:256
mysql備份資料庫命令linux 瀏覽:544
車輛解壓手續怎麼樣 瀏覽:432
怎麼提安卓版本號 瀏覽:622
pdf轉換成word網頁版 瀏覽:313