返回列表 发帖

用Apache镜像Wordpress站

想给自己的Blog做一个国内的镜像站点,类似于xys.3322.org镜像www.xys.org。据我观察,新雨丝镜像使用的是Apache服务器[1]的Proxy Throughput功能[2],xys.3322.org并不实际存放任何数据,而是作为一个跳板,或者叫反向代理(Reverse Proxy)[3][4],代理那些不能访问新雨丝主站的用户访问主站内容。这种镜像站点具有“实时跟新”的特点,而也省去了同步网站的复杂的技术操作。

由于我的Blog架设在国外,所以自然而然想到做一个国内镜像。一般的镜像没有“实时更新”的特点,同步网站的操作也需要我每次把同一篇文章发在两个Blog上。更加复杂的是每个wordpress的配置都需要做两遍。最不能容忍的是没法同步Comments。如果能用Apache直接动态实时镜像网站内容就最好了。

下面的配置都是在镜像网站dipplum.org上完成的。


首先配置Apache模块,需要enable rewrite和proxy模块

a2enmod rewrite proxy

然后清空原dipplum.org网站的主文件目录所有内容(如果有的话),可以考虑给原来的目录改名,然后新建一个主目录。编辑该目录下的.htaccess文件,内容如下

RewriteEngine on
RewriteRule ^(.*)$ http://dipplum.com/$1 [P]

Apache的配置就结束了。这时访问镜像站点会发现,首页内容虽然镜像过来了,但是首页中所有文件的链接都指向主站,而不是镜像站点。这就失去了镜像的意义,用户只有在访问首面时才能使用镜像,其他地方访问的都是主站。

这是因为wordpress引擎生成链接URL的时候,都会自动将Blog的站点URL加为前缀。而Apache的rewrite模块只代理HTTP请求消息,而把回复的HTML报文原封不动转发给请求方。如果可以让wordpress生成本站的链接使用Relative URL而不是Absolute URL,这个问题自动就解决了。

翻阅wordpress项目网站[5],发现和我有类似需求[6][7]的人很多(也就是mirror站点、站点迁移、一站多域名这样的需求),但是问题都不能解决,想来是wordpress官方根本不支持用Relative URL。

最后在一个wordpress用户网站上找到了解决方案[8]。这需要修改wordpress主站的配置文件,在用户模板的Header文件中,DOCTYPE声明前,加上下面这段内容:

<?php
function relative_links($str) {
$url = ‘http://dipplum.com’;
$str = str_replace(”‘” . $url .”/”, “‘/”, $str);
$str = str_replace(’”‘ . $url . ‘/’, ‘”/’, $str);
$str = str_replace(’”‘ . $url . ‘”‘, ‘”/”‘, $str);
$str = str_replace(”‘” . $url . “‘”, “‘/’”, $str);
return $str;
}
ob_start(’relative_links’);
?>

上面这段脚本会自动运行,把生成页面中所有包含http://dipplum.com的绝对路径修改成相对路径。

这时再访问镜像站点,就会发现所有的本站链接,都在浏览器中正确指向镜像站点了。

参考

http://httpd.apache.org/
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass
http://httpd.apache.org/docs/2.2 ... guide_advanced.html
http://wordpress.org/support/
http://wordpress.org/tags/relative
http://wordpress.org/tags/uri
http://mathiasbynens.be/archive/2005/02/relative-links
Solaris UltraSPARC StorgeTEK JAVA
我的MSN:xasun_029@hotmail.com
我的Blog:http://sun029.blog.ixpub.net

返回列表