May 17

最近WordPress成为攻击的热点,本来我也不想升级的,无奈一个博客被提示遭攻击了,决定还是升级一下。但是升级后遇到一个问题:WordPress 可视化编辑器不能用。

解决方案:
在wp-config.php文件最后加入代码:

define('CONCATENATE_SCRIPTS', false );
Oct 20

转自:https://liruqi.wordpress.com/2011/02/26/reverse-proxy-for-wordpress/

做这个的起因是之前 @annsherry_ 希望给自己的博客(http://annsherry.wordpress.com/) 绑定一个独立域名。我看了下后台配置,发现 wordpress.com 不让用A记录的方式配置,要想绑定域名,需要把自己的域名 nameserver 改成 wordpress的,让wordpress 帮你解析。作为一名互联网工作者,这种霸王条款当然是深深伤害了像我这种高端用户的感情。所以研究了一下用自己的主机给 *.wordpress.com 做反向代理的方法。

研究过程很纠结。我先把结论拿出来,然后大概解释下为什么。

比如,我希望把 annsherry.wordpress.com 绑定到 liruqi.me。步骤如下:

1. 重新编译 nginx, 加上 HttpSubModule(http://wiki.nginx.org/HttpSubModule) 模块。简而言之,是 ./configure 时加上参数 –with-http_sub_module 其它参数保持不变即可。
2. 修改Nginx 配置。在 http 块中加入 server:

server {
listen   80;
server_name liruqi.me;
location / {
proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header  Accept-Encoding  ”";
proxy_pass http://annsherry.wordpress.com;
sub_filter annsherry.wordpress.com liruqi.me;
sub_filter_once off;
}
}

3. 启动 nginx 或者重新加载配置文件.

只要 域名 liruqi.me 是指向正确的主机ip, 反向代理就做好了。而且点链接不会跳回到 annsherry.wordpress.com 域名上。

大概说下原理。
a) *.wordpress.com 上的连接不少是绝对路径。如果直接proxy_pass ,再点一次连接就会回到 wordpress 域名上。所以这里做了一个简单的文本替换。
HttpSubModule 仅支持单模式的纯文本替换,不支持正则表达式。如果希望用正则,做一个更复杂的替换,可以考虑一个华人开发的 HttpSubsModule (http://wiki.nginx.org/HttpSubsModule) 第三方模块。

b) proxy_set_header Accept-Encoding ””; 这一项,可以让nginx 不法送 Accept-Encoding HTTP header。这个时候,wordpress 返回的页面是不做 gzip压缩的。因为gzip 压缩之后,文本替换就会失效了。
国外有VPS的同学(而且ip没被墙的),可以考虑用类似的方式给自己的 blogspot 或者其它博客做反向代理。
另外,我现在没有给自己的 liruqi.com 做反向代理了(之前是反向代理到 appspot 上的 micolog),而是直接跳转到 http://liruqi.wordpress.com/。另外,我也建议大家少自己折腾搭建博客,不止一次见过把博客做在 VPS 上,然后因各种原因丢数据。而数据的价值,远大于技术本身。

Jul 01

背景:因为收到了Google的加速服务Page Speed Service的邀请邮件,打算使用Page Speed Service来提高网速,但是有一个很郁闷的问题,Page Speed Service不能对裸域进行设置,只能对形如a.abc.com二级域名进行加速,而我准备将www.abc.com作为正常访问的加速后的域名,所以我就必须重新设置一个二级域名,还需要保证这个二级域名的内容与裸域的内容一致,这时我就想到了WordPress多站镜像同步方案来了,可以设置一个二级域名与裸域共用一个数据库,这样只需要在裸域下进行内容的更新就可以了,同时www.abc.com进行加速后内容也与裸域保持一致,这样就达到了预期的目的了。

参照方案:http://www.wx35.cn/archives/735/

具体步骤如下:
1.首先安装你的裸域名WordPress,主域名无须特别设置,只需要共享MYSQL远程链接。Godaddy的数据库是可以设置MYSQL共享的,但是需要在一开始的时候设置,如果没有实现设置,那么安装完成以后就不能设置了。这里的MYSQL共享是指可以将镜像WordPress安装到另外一台主机上,但是内容一模一样。由于我没有实现设置,所以不能安装到另外一台主机上,但是我将镜像安装到了同一主机下就变相地达到了目的。

2.安装镜像站WordPress,版本与主域名一致,最好直接将主域名的安装文件直接复制过来,只需要修改一下镜像站的wp-config.php文件,完整代码如下:.

<?php
// ** MySQL settings ** //
define('DB_NAME', 'name');  
define('DB_USER', 'user'); 
define('DB_PASSWORD', 'pass'); 
define('DB_HOST', '主域名MYSQL地址'); 
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');
define('WP_HOME', 'http://m.chunchu.org');
define('WP_SITEURL', 'http://m.chunchu.org');

$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!

define ('WPLANG', 'us_EN');

/* That's all, stop editing! Happy blogging. */

define('ABSPATH', dirname(__FILE__).'/');
require_once(ABSPATH.'wp-settings.php');
?>

由于我的镜像与主域名是同一主机,所以将wp-config.php文件修改完成后,连基本的安装过程都不需要就可以正常的访问了。

3.图片及文件共享。将图片及文件分离出来,你可以绑定一个独立域名来访问图片及文件,完整的MYSQL命令如下:

UPDATE wp_posts SET post_content = replace(post_content, 'http://chunchu.org', 'http://img.chunchu.org')

由于我写文章的时候,直接就将图片和文件放在Google Storage上了,所以不需要这一步了,而且速度快,容量大,便于多次使用。至于原文中提到的使用cos-html-cache将WordPress真正的静态化,我就不需要这个插件了,记得很久以前就是由于使用了这个插件,导致一片文章发表后很长时间首页仍然不能更新后,就再也不想用它了,我的WordPress很少使用插件的。

Jun 09

iTheme是由ndesign-studio设计的一款仿苹果的Wordpress主题,你现在看到的我的这个博客用的就是这个主题,官方地址为http://ndesign-studio.com/wp-themes/itheme,上面有详细的介绍和下载链接。但是美中不足的是日期的显示不正确,也就是说日期不能完整的显示出来,你只能看到一个白板,我在网上找到了一个修正版本,地址为http://storage.chunchu.net/Picture/Blog/itheme-1-1.zip。

原模板只有两栏,有人将之修改为对称的三栏,颜色也有经典的蓝色改为Grassy Green、Midnight Blue、Ruby Red、Snazzy Pink四种,这样选择的可能性更多了。原来的下载地址为http://www.mangoorange.com/resources/i3theme/,需要注册才能下载,我将之下载后重新打包上传到我的网盘上,你可以直接将这十几个文件一起下载下来慢慢挑选。下载地址为http://storage.chunchu.net/Picture/Blog/iTheme.zip。具体的目录如下:

iThemeAds (Background Color = Black):
iThemeAds 1.0 Black (Left)
iThemeAds 1.0 Black (Center)
iThemeAds 1.0 Black (Right)

iThemeAds (Background Color = Blue):
iThemeAds 1.0 Blue (Center)
iThemeAds 1.0 Blue (Left)
iThemeAds 1.0 Blue (Right)

Classic:
i3Theme 1.8.1 Classic (Center Edition)
i3Theme 1.8.1 Classic (Center Fluid Edition)
i3Theme 1.8.1 Classic (Left Edition)
i3Theme 1.8.1 Classic (Fluid Left Edition)
i3Theme 1.8.1 Classic (Right Edition)
i3Theme 1.8.1 Classic (Fluid Right Edition)

Grassy Green:
i3Theme 1.8.1 Grassy Green (Center Edition)
i3Theme 1.8.1 Grassy Green (Fluid Center Edition)
i3Theme 1.8.1 Grassy Green (Left Edition)
i3Theme 1.8.1 Grassy Green (Fluid Left Edition)
i3Theme 1.8.1 Grassy Green (Right Edition)
i3Theme 1.8.1 Grassy Green (Fluid Right Edition)

Midnight Blue:
i3Theme 1.8.1 Midnight Blue (Center Edition)
i3Theme 1.8.1 Midnight Blue (Fluid Center Edition)
i3Theme 1.8.1 Midnight Blue (Left Edition)
i3Theme 1.8.1 Midnight Blue (Fluid Left Edition)
i3Theme 1.8.1 Midnight Blue (Right Edition)
i3Theme 1.8.1 Midnight Blue (Fluid Right Edition)

Ruby Red:
i3Theme 1.8.1 Ruby Red (Center Edition)
i3Theme 1.8.1 Ruby Red (Fluid Center Edition)
i3Theme 1.8.1 Ruby Red (Left Edition)
i3Theme 1.8.1 Ruby Red (Fluid Left Edition)
i3Theme 1.8.1 Ruby Red (Right Edition)
i3Theme 1.8.1 Ruby Red (Fluid Right Edition)

Snazzy Pink:
i3Theme 1.8.1 Snazzy Pink (Center Edition)
i3Theme 1.8.1 Snazzy Pink (Fluid Center Edition)
i3Theme 1.8.1 Snazzy Pink (Left Edition)
i3Theme 1.8.1 Snazzy Pink (Fluid Left Edition)
i3Theme 1.8.1 Snazzy Pink (Right Edition)
i3Theme 1.8.1 Snazzy Pink (Fluid Right Edition)

Apr 06

WordPress的日志自动保存和修订版本功能本来是用来防止文章编辑过程中丢失和多人博客的版本控制的新功能,但是在实际使用过程中,像我的博客就是架设在Heroku上的,免费提供的数据库只有可怜的5M,所以为了更合理的使用数据库的空间,就有必要关闭WordPress的日志自动保存和修订版本功能。关闭这一功能的方法有两种,一种是采用插件的方法,如delete-revision插件,另一种就是直接修改代码。由于我不喜欢使用插件,所以我比较倾向于使用后一种方法,但是使用后一种在Wordpress升级的时候可能会导致被替换掉。对于像我一样使用Heroku这些免费云的用户,代码是通过推送到远方服务器的,不能通过自动更新的进行更新,所以也不担心会被替换掉。

具体的修改方法如下,打开wp-admin文件夹下的post-new.php、post.php、page-new.php和page.php文件,删除或注释掉以下的这行代码:

wp_enqueue_script('autosave');

然后打开根目录下的wp-config.php文件,在

require_once(ABSPATH . 'wp-settings.php')

在这行代码前面的任意地方或者文件的开通添加代码:

define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL', false);

另外,对于已经保存到数据库垃圾文件,可以phpMyAdmin里使用SQL语句进行删除,具体的命令如下:

DELETE FROM 'wp_posts' WHERE 'wp_posts'.'post_status' = 'inherit'
DELETE FROM 'wp_posts' WHERE 'wp_posts'.'post_status' = 'auto-draft'