很不幸,今天开始,GAE的云计算服务全面被屏蔽了,appspot.com 被关键字封锁,我的很久远时候做的小站魔兽世界语音中英文对比在线听也无法访问到了。虽然站点访问稀少,但作为一个已上线服务,还是需要尽力保证其可用性的。所以,快马加鞭,做解决方案,处理问题。
为了让App Engine小站在国内能够访问,我们需要使用一台国外的服务器来进行代理。正好,为了免除备案等麻烦的手续,本博客搭建的时候就购买了淘宝上最便宜的一款美国VPS,虽然比较慢,相比于放在国内,还是能够接受的。故此,便编写了一段PHP文件来进行代理中转。
首先,在域名商添加二级域名映射,将wow.yorkgu.me映射至VPS的IP地址。
然后,更改apache的Vhost配置,如下:
<VirtualHost *:80> ServerName wow.yorkgu.me DocumentRoot /var/www/routers_php <Directory /var/www/routers_php> RewriteEngine On RewriteRule . index.php Options -Indexes -MultiViews </Directory> </VirtualHost>
将该域名的DocumentRoot映射至放置用来做路由的PHP文件夹,并配置Rewrite让所有请求都通过index.php来进行处理,这样便可以在index.php中根据用户的当前访问抓取所对应的真实的url地址的内容能够,然后将抓取到的数据返回给客户端。
要实现代理抓取,首先需要使用PHP来实现url的抓取,这里,我对curl进行了简单封装,实现了HTTP GET和POST抓取。代码如下:
class HttpUtil { public static function curl_get($url, $header){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLINFO_HEADER_OUT, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $r = curl_exec($ch); curl_close($ch); return $r; } public static function curl_post($url, $header, $data=array()){ $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLINFO_HEADER_OUT, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $_data = array(); foreach($data as $key=>$value) $_data[] = urlencode($key)."=".urlencode($value); $data_str = join("&", $_data); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_str); $r = curl_exec($ch); curl_close($ch); return $r; } }
如果要支持带cookie的访问,我们只需要在header参数中指定cookie部分就可以了。
再然后,我们就可以编写主体的用来进行代理的代码了。代码就不贴了,可以在后面进行下载。在这段代码中,实现了下面几项小功能点:
- 代理客户端的GET和POST请求
- 向目标服务器抓取时,使用浏览器传送过来的header信息
- 处理服务器返回的重定向
- 将抓取的数据的md5置入为返回的ETag,并处理IF_NONE_MATCH,以减少数据发送量,加快客户端访问。如果你需要代理的站点已处理了ETag信息,需要将这段代码删除。
代码下载,如果按照上面的VHOST配置,解压缩之后放在/var/www/routers_php目录下即可。
试试 http://wow.yorkgu.me/,好像APP Engine服务今天晚上不是很稳定,可能需要多刷几次页面。
如有需要把自己的小站代理成国内能够访问的朋友,同时又能接受我这最便宜的VPS所带来的比较慢的国内访问速度,我这边可免费帮您提供代理服务。邮件至 gyq5319920 [at] gmail.com