GHS代理PHP简版

不知道为什么,我一用HTTP/1.1发送请求,GHS代理就慢得要死。即是改用HTTP/1.0发送请求,如果把服务器端的Header转发给用户,照样慢的要死。不知道是怎么回事,所以只好写出这个只具备一般浏览功能,连POST都不支持,更别说301转向之类的GHS代理的PHP版本。

采用fsockopen获取数据。

首先,把绑在GHS的域名绑到某PHP空间,并将实际DNS指向该PHP空间。该空间需要支持.htaccess和URL ReWrite。

然后,把下面内容保存为index.php,传到根目录:

<?php
//header不完整,强制为HTTP 1.0
$ghslist=
array(
"72.14.203.121",
"72.14.207.121",
"74.125.43.121",
"74.125.47.121",
"74.125.53.121",
"74.125.77.121",
"74.125.93.121",
"74.125.95.121",
"74.125.113.121",
"216.239.32.21",
"216.239.34.21",
"216.239.36.21",
"216.239.38.21",
);
$ghsnum=rand(0,count($ghslist));

//set_time_limit(600);
//error_reporting(0); //禁止显示错误

//取得所有http header
if (!function_exists('getallheaders')) 
{
    function getallheaders() 
    {
       foreach ($_SERVER as $name => $value) 
       {
           if (substr($name, 0, 5) == 'HTTP_') 
           {
               $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
           }
       }
       if (isset($_SERVER['PHP_AUTH_DIGEST'])) { 
		    $headers['AUTHORIZATION'] = $_SERVER['PHP_AUTH_DIGEST']; 
			} elseif (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { 
		    $headers['AUTHORIZATION'] = base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $_SERVER['PHP_AUTH_PW']); 
			} 
			if (isset($_SERVER['CONTENT_LENGTH'])) { 
		    $headers['CONTENT-LENGTH'] = $_SERVER['CONTENT_LENGTH']; 
			} 
			if (isset($_SERVER['CONTENT_TYPE'])) { 
		    $headers['CONTENT-TYPE'] = $_SERVER['CONTENT_TYPE']; 
			}
       return $headers;
    }
}

  class   http{   
  
    function   http_fopen($conn_host,$conn_port="80"){   
        $fp=fsockopen($conn_host,$conn_port);   
        if(!$fp){   
                      return   false;   
        }   
        return $fp;
    }   
    //得到查询内容   
    function   http_fget($fp){   
    	//向服务器发送header
    	$fp=$this->sendHeaders($fp);
    	//向客户端发送header
			while(!feof($fp))
			{
				$content=fgets($fp);
				if(trim($content)=="")
				{
					break;
				}
				//header($content);
				//echo $content;
			}
			//显示网页内容
			while(!feof($fp))
			{
				echo fgets($fp,128);
			}
    }   
    /*//设置头部信息
    function setHeaders()
		{
			$headers=getallheaders();
			//传送访客IP信息
			if (isset($_SERVER['REMOTE_ADDR']))
			{
				$headers['X-Real-IP'] = $_SERVER['REMOTE_ADDR']; 
			}
			if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
			{
				$headers['X-Forwarded-For'] = $_SERVER['HTTP_X_FORWARDED_FOR']; 
			}
			else
			{
				$headers['X-Forwarded-For'] = $_SERVER['REMOTE_ADDR']; 
			}
			return $headers;
		}*/
		//发送头部信息
		function sendHeaders($fp)
		{
			//$requestHeader=$this->setHeaders();
			$theREQUEST_METHOD=isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD']:'GET';
			$http_host=$_SERVER['HTTP_HOST'];//$requestHeader['Host']="creke.net";//在这里更改http请求时远程主机
			$theREQUEST='http://'.$http_host.$_SERVER['REQUEST_URI'];//isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI']:'/';//这里设置请求的URI
			$theSERVER_PROTOCOL='HTTP/1.0';//isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL']:'HTTP/1.1';
			$firstHeader=$theREQUEST_METHOD." ".$theREQUEST." ".$theSERVER_PROTOCOL."\n";
			fputs($fp,$firstHeader);
			fputs($fp,"Host: $http_host\n");
			fputs($fp,"User-agent: ".$_SERVER[’HTTP_USER_AGENT’]."\n");
			/*foreach($requestHeader as $name => $value) 
			{
				fputs($fp,"$name: $value\n");
			}*/
			//发送post内容,这里有问题
			if(strtolower($theREQUEST_METHOD)=='post')
			{
				$line = file_get_contents("php://input");
				fputs($fp,$line);
			}
			fputs($fp,"\n");
			return $fp;
		}
		function http_fclose($fp)
		{
			fclose($fp);
		}
  }   

$thehost="ghs.google.com";//$ghslist[$ghsnum];
$http=new   http;     
$fp=$http->http_fopen($thehost);   
if(!$fp)
{   
  echo"sorry,con't   connect";   
  exit;   
}   
//得到返回的结果   
$http->http_fget($fp);
$http->http_fclose($fp);
exit();
?>

然后,在.htaccess添加如下的ReWrite规则:

RewriteEngine   on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule     (.*) /index.php [L]

这样就OK了。

以后每次访问到这个PHP空间的请求,都会通过fsockopen重新请求到ghs.google.com,这样就达到的GHS代理的目的。最后再提醒一次,本PHP版代理只支持网页浏览,对于POST、301转向等GHS应用暂不支持。

19 comments

  1. mickey says:

    你鬼画符的给谁看啊?

    1. creke says:

      临兵斗者皆阵列在前——诛邪!

  2. OceanBan says:

    对php不是太了解,刚刚废了老半天申请免费php空间,好像都不支持.htaccess,而且对.htaccess也不是很了解。
    水平太差了,有成品没有。

  3. 江湖客 says:

    做的成品。绑定到此IP就行了。没有nginx的好用,这个支持就浏览115599.ampsites.com

    1. creke says:

      这个只有你自己的域名能用的,跟nginx的原理不同,呵呵。

  4. 江湖客 says:

    请问影响收录吗?不会有影响吗?

    1. creke says:

      这个跟收录不会相互影响

  5. Chu says:

    用000webhost的免费空间试用了一下,直接跳转到错误页面,我查询了一下,000webhost的免费空间是支持.htaccess和URL ReWrite的,不知道是什么原因

    1. creke says:

      很可能是rewrite规则没写对。

  6. samt says:

    在IE下浏览正常,在谷歌和浏览都不正常

  7. samt says:

    在IE下浏览正常,用谷歌和火狐浏览都不正常

    1. creke says:

      请检查是不是没有将PHP的error reporting关闭

  8. abc101 says:

    creke老大,你的东西很管用啊,我弄了以后基本满意。但不知道我哪里出了点错,裸域时访问提示301页面重置了。有空你帮我看看吧,地址:http://jsyjs.co.cc
    在下业余爱好者,如果回复内容很多的话,就发我邮箱吧

    1. creke says:

      我这里只要是访问co.cc都会被重置的。你自己多测试一下。

  9. abc101 says:

    回复那么快啊,谢谢,有最新进展一定向您汇报

  10. abc101 says:

    老大,我在头上做了个301跳转,解决了。既然系统只肯吃3w,我就喂3w了。另外,friefox和oprea测试发现,css丢失,谷歌的浏览器还没测。

    1. creke says:

      呵呵,你要自己慢慢研究啦。这个代理只是实验性的东西,并不完善,每个人都可能遇到不同的问题。

Leave a comment