使用PHP实现反向代理
2018-10-26 11:00:04    55    0    0
emengweb

简单的php基于curl的反向代理程序

index.php

<?php 
set_time_limit(60);
if( !defined('__DIR__') )
{
  define('__DIR__',dirname(__FILE__)) ;
}

$_REQUEST['url'] =gtRootUrl();
//改成网站正式服务器ip
$ip= '127.0.0.1';
$aAccess = curl_init() ;
// --------------------
// set URL and other appropriate options
curl_setopt($aAccess, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($aAccess, CURLOPT_HEADER, true);
curl_setopt($aAccess, CURLOPT_RETURNTRANSFER, true);
curl_setopt($aAccess, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($aAccess, CURLOPT_SSL_VERIFYPEER, false);  
curl_setopt($aAccess, CURLOPT_SSL_VERIFYHOST, false);  
curl_setopt($aAccess, CURLOPT_TIMEOUT, 60);
curl_setopt($aAccess, CURLOPT_BINARYTRANSFER, true);
//curl_setopt($aAccess, CURLOPT_HTTPPROXYTUNNEL, 0);
curl_setopt($aAccess,CURLOPT_PROXY,$ip.':80');
//curl_setopt($aAccess,CURLOPT_PROXY,'127.0.0.1:8888');

if(!empty($_SERVER['HTTP_REFERER']))
    curl_setopt($aAccess,CURLOPT_REFERER,$_SERVER['HTTP_REFERER']) ;



$headers=get_client_header();
curl_setopt($aAccess,CURLOPT_HTTPHEADER,$headers) ;

if( $_SERVER['REQUEST_METHOD']=='POST' )
{
	curl_setopt($aAccess, CURLOPT_POST, 1);
	curl_setopt($aAccess, CURLOPT_POSTFIELDS, http_build_query($_POST));
}


// grab URL and pass it to the browser

$sResponse = curl_exec($aAccess);
list($headerstr,$sResponse)=parseHeader($sResponse);
$headarr= explode("\r\n", $headerstr);
foreach($headarr as $h){
	if(strlen($h)>0){
		if(strpos($h,'Content-Length')!==false) continue;
		if(strpos($h,'Transfer-Encoding')!==false) continue;
		if(strpos($h,'Connection')!==false) continue;
		if(strpos($h,'HTTP/1.1 100 Continue')!==false) continue;
		header($h);
	}
}

function replace_html_path($arrMatche)
{	
	$sPath = makeUrl($arrMatche[4]) ;
	if( strtolower($arrMatche[1])=='img' )
	{
		$sPath.= '&bin=1' ;
	}
	
	return "<{$arrMatche[1]} {$arrMatche[2]} {$arrMatche[3]}=\"{$sPath}\"" ;
}

function get_client_header(){
	$headers=array();
	foreach($_SERVER as $k=>$v){
		if(strpos($k,'HTTP_')===0){
			$k=strtolower(preg_replace('/^HTTP/', '', $k));
			$k=preg_replace_callback('/_\w/','header_callback',$k);
			$k=preg_replace('/^_/','',$k);
			$k=str_replace('_','-',$k);
			if($k=='Host') continue;
			$headers[]="$k:$v";
		}
	}
	return $headers;
}

function header_callback($str){
	return strtoupper($str[0]);
}

function parseHeader($sResponse){
	list($headerstr,$sResponse)=explode("\r\n\r\n",$sResponse, 2);
	$ret=array($headerstr,$sResponse);
	if(preg_match('/^HTTP\/1\.1 \d{3}/', $sResponse)){
		$ret=parseHeader($sResponse);
	}
	return $ret;
}

function gtRootUrl()
{
//缓存结果,同一个request不重复计算
 static $gtrooturl;
 if(empty($gtrooturl)){
	// Protocol
	$s = !isset($_SERVER['HTTPS']) ? '' : ($_SERVER['HTTPS'] == 'on') ? 's' : '';
	$protocol = strtolower($_SERVER['SERVER_PROTOCOL']);
	$protocol = substr($protocol,0,strpos($protocol,'/')).$s.'://';
	// Port
	$port = ($_SERVER['SERVER_PORT'] == 80) ? '' : ':'.$_SERVER['SERVER_PORT'];
	// Server name
	$server_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'].$port : getenv('SERVER_NAME').$port;
	// Host
	$host = isset($_SERVER['HTTP_HOST']) ? strtolower($_SERVER['HTTP_HOST']) : $server_name;

	 $gtrooturl=$protocol.$host.$_SERVER['REQUEST_URI'];
	}
		return $gtrooturl;
}

// close cURL resource, and free up system resources
curl_close($aAccess);
echo $sResponse ;
?>


上一篇: October CMS视频教程合集

下一篇: uikit导航

55 人读过
文档导航