2010年6月4日星期五

寻找 ghs.google.com 的可用 IP?

这么久了,头一次想到用 PHP 作数据转发,实现 Google 服务域名绑定在中国大陆的可用性。上来一搜,没想到已经有高手写出了这样的代码:梦溪博客的博主给出了一个他编写的 PHP 版本 GHS 转发原型,具备一般的网页浏览功能;暂不支持 HTTP 转发和 POST 等附加功能。但想必这已足够了。

详细的 PHP 代码请查看来自梦溪博客的文章。

使用方法非常简单,只需要一个可访问到 ghs.google.com 的支持 PHP、开启 rewrite 和 fopen 功能的任意服务器。(几乎各种免费 PHP 空间、GoDaddy 赠送的 Linux 空间等都可以支持)
随后,只需把你在 Google 服务中绑定的域名指向你的这个服务器 IP,把梦溪博客上提供的代码保存为 index.php,并如文章所述,编辑一个 .htaccess 文档,同置于根目录下即可。
如此一来,访问这个主机将实现从 Google 获取转发数据,实现网页浏览。此转发页面支持 Blogger、appspot 等服务的域名绑定。
为梦溪博客鼓掌吧。

最后,附上完整代码。
index.php 文件:

<?php
//header不完整,强制为HTTP 1.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;
}
}
//显示网页内容
while(!feof($fp))
{
echo fgets($fp,128);
}
    }
//发送头部信息
function sendHeaders($fp)
{
$theREQUEST_METHOD = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD']:'GET';
$http_host = $_SERVER['HTTP_HOST'];
$theREQUEST = 'http://'.$http_host.$_SERVER['REQUEST_URI'];
$theSERVER_PROTOCOL = 'HTTP/1.0';
$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");
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";
$http = new http;
$fp = $http->http_fopen($thehost);
if(!$fp)
{
  echo "Could not connect!";
  exit;
}
//得到返回的结果
$http->http_fget($fp);
$http->http_fclose($fp);
exit();
?>


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