编程语言您现在的位置是:首页 > 博客日志 > 编程语言

用PHP实现反向代理服务器

<a href='mailto:'>微wx笑</a>的头像微wx笑2019-08-06 11:20:28编程语言人已围观关键字:

简介实现的逻辑主要就是一下三步:1. 从$_SERVER获取浏览器请求的内容,传说中的Request,并进行一些修改。2. 用curl将Request发到后端机器上,并等待后端的返回内容 传说中的Response

实现的逻辑主要就是一下三步:UO0编程技术_踩坑日志_进阶指南 - 无知人生


UO0编程技术_踩坑日志_进阶指南 - 无知人生

1. 从$_SERVER获取浏览器请求的内容,传说中的Request,并进行一些修改。UO0编程技术_踩坑日志_进阶指南 - 无知人生


UO0编程技术_踩坑日志_进阶指南 - 无知人生

2. 用curl将Request发到后端机器上,并等待后端的返回内容 传说中的Response。UO0编程技术_踩坑日志_进阶指南 - 无知人生


UO0编程技术_踩坑日志_进阶指南 - 无知人生

3. Response中包含Header和Body,分别用header函数和echo函数将它们发到浏览器渲染。UO0编程技术_踩坑日志_进阶指南 - 无知人生


UO0编程技术_踩坑日志_进阶指南 - 无知人生

4. 用rewrite规则将请求发给index.php上执行。UO0编程技术_踩坑日志_进阶指南 - 无知人生

<?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 ;

完整思想参考原网址UO0编程技术_踩坑日志_进阶指南 - 无知人生

https://my.oschina.net/jamesren/blog/668495UO0编程技术_踩坑日志_进阶指南 - 无知人生


UO0编程技术_踩坑日志_进阶指南 - 无知人生

很赞哦! () 有话说 ()

相关文章

站点信息

  • 建站时间:2018-10-24
  • 主题模板《今夕何夕》
  • 文章统计:102篇
  • 文章评论:7条
  • 文章阅读:281次
  • 文章点赞:341次
  • 微信公众号:扫描二维码,关注我们