導航:首頁 > 編程語言 > 反向代理php程序

反向代理php程序

發布時間:2022-07-13 06:36:44

⑴ nginx反向代理.php

nginx反向代理跟php之類的沒有太大關系吧,麻煩把問題描述清楚。

⑵ 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 狀態

⑶ 誰能解釋一下nginx反向代理是什麼意思

nginx反向代理的意思:就是代理內部伺服器對外進行服務的 nginx 代理服務。

nginx反向代理的反向性在於:Nginx作為負載均衡服務時Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理服務對外進行服務。

反向代理的方向與正向代理相反,代表外部網路用戶向內部伺服器發出請求,即接收來自Internet上用戶的連接請求,並將這些請求轉發給內部網路上的伺服器,然後將從內部伺服器上得到的響應返回給Internet上請求連接的客戶。

反向效果:對於用戶而言,反向代理伺服器就相當於目標伺服器,即用戶直接訪問反向代理伺服器就可以獲得目標伺服器的資源。用戶不需要知道目標伺服器的地址,作為Web伺服器的前置機來降低網路和伺服器的負載,提高訪問效率。

(3)反向代理php程序擴展閱讀:

反向代理的優勢:

1、加快了對內部伺服器的訪問速度

在內部伺服器前放置兩台反向代理伺服器,分別連接到教育網和公網,這樣公網用戶就可以直接通過公網線路訪問學校伺服器,從而避開了公網和教育網之間擁擠的鏈路。同時反向代理伺服器的緩存功能也加快了用戶的訪問速度。

2、節約了有限的IP資源

校園網內部伺服器除使用教育網地址外,也會採用公網的IP地址對外提供服務,公網分配的IP地址數目是有限的,如果每個伺服器有分配-個公網地址,那是不可能的,通過反向代理技術很好地解決了IP地址不足的問題。

⑷ 使用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; } } ?>

⑸ PHP header方法 反向代理時出現問題

各色人等還不如發紅包的發而黑色人

⑹ 如何開啟apache虛擬目錄反向代理

如何開啟apache虛擬目錄反向代理

現有2個項目,A:php項目,B:java項目。由於域名解析只能使用80埠,因此需要apache來反向代理。apache使用80埠,tomcat使用8080.

apache下httpd.conf中開啟以下模塊:

# Virtual hosts 載入虛擬主機功能

Include conf/extra/httpd-vhosts.conf#開啟代理相關模塊

LoadMole proxy_mole moles/mod_proxy.so

LoadMole proxy_ajp_mole moles/mod_proxy_ajp.so

LoadMole proxy_balancer_mole moles/mod_proxy_balancer.so

LoadMole proxy_connect_mole moles/mod_proxy_connect.so

LoadMole proxy_ftp_mole moles/mod_proxy_ftp.so

LoadMole proxy_http_mole moles/mod_proxy_http.soLoadMole vhost_alias_mole moles/mod_vhost_alias.so

httpd-vhosts中添加

<VirtualHost *:80>

ServerName yxj.zhoushangang.cn

ProxyPreserveHost On

ProxyRequests Off

ProxyPass / http://localhost:8080/

ProxyPassReverse / http://localhost:8080/

ErrorLog logs/wap.xxx.com_error_log

CustomLog logs/wap.xxx.com_access_log common

</VirtualHost>

⑺ 如何利用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」值.

⑻ php利用Nginx如何實現反向代理

閱讀全文

與反向代理php程序相關的資料

熱點內容
二進制流轉pdf 瀏覽:915
php判斷爬蟲 瀏覽:569
960除24除4簡便演算法 瀏覽:786
關於解壓英語翻譯 瀏覽:565
python控制鍵盤右鍵 瀏覽:920
php沒有libmysqldll 瀏覽:828
時政新聞app哪個好 瀏覽:906
手機已加密怎麼辦 瀏覽:201
安卓手機截屏怎麼傳到蘋果 瀏覽:527
京管家app哪裡下載 瀏覽:33
文件夾橫向排列的豎向排列 瀏覽:453
51單片機驅動攝像頭模塊 瀏覽:689
政府文件加密沒法轉換 瀏覽:373
android判斷棧頂 瀏覽:331
憑證軟體源碼 瀏覽:860
androidwebview滾動事件 瀏覽:11
如何將電腦上的圖片壓縮成文件包 瀏覽:899
程序員轉金融IT 瀏覽:837
黑馬程序員培訓效果如何 瀏覽:915
本地集成編譯 瀏覽:528