By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
使用PHP实现反向代理
2018-10-26 11:00:04    78    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导航

78 人读过
文档导航