基於php的網站反向代理程序,phpstudy反向代理

本文目錄一覽:

使用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){ copy($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_dump(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_dump($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(”,”,$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-dump_chunk($chunk); flush(); ob_flush(); $i = $i + $endChar; } } else{ echo($this-content); } //echo “header: “.print_r($headerArray); //header($this-resultHeader); } } function dump_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利用Nginx如何實現反向代理

我們要首先準備好環境,我準備好了nginx環境和apache的環境

apache是開的8080埠,nginx開的80埠

我們去配置一下nginx的配置文件,proxy_pass必須加上http

apache配置一虛擬主機,不詳解說明怎樣配置的虛擬主機,配置虛擬主機非常簡單

我們在nginx目錄下動手寫一個php的文件

6

先在我們訪問一下這個地址,nginx解析了html有解析了php,這樣就實現了反向代理(靜動分離)

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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/286008.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 16:06
下一篇 2024-12-22 16:06

相關推薦

  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python爬蟲可以爬哪些網站

    Python是被廣泛運用於數據處理和分析領域的編程語言之一。它具有易用性、靈活性和成本效益高等特點,因此越來越多的人開始使用它進行網站爬取。本文將從多個方面詳細闡述,Python爬…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • 網站為什麼會被黑客攻擊?

    黑客攻擊是指利用計算機技術手段,入侵或者破壞計算機信息系統的一種行為。網站被黑客攻擊是常見的安全隱患之一,那麼,為什麼網站會被黑客攻擊呢?本文將從不同角度分析這個問題,並且提出相應…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29

發表回復

登錄後才能評論