这题目有点复杂,问题也有点复杂,当定语越多的时候也说明越难搞。
先说明一下背景:我主机用的是Nginx;我的Wordpress开启了多站点的功能,加上我的这博客,一共有三个站点,一个是May’s Blog(简称B站),一个是我们的收藏夹(简称C站);我想用wp-super-cache这个插件来给博客提速。
再说明一下问题:我安装了wp-super-cache的version 1.1后因为开启了多站点,出现了当我访问B站和C站主页时显示的“杜小白之家”的主页。我主博客的缓存能正常的工作,而且当我访问B站和C站的固定链接时,即非主页的链接,是可以正常显示的。
解释一下问题:这问题很显然与多站点有关,这问题也不是缓存工不工作的问题,直觉告诉我是跳转的问题,但很奇怪域名没有跳转的,只是在B站和C站的主页上显示出了我主博客的主页。我暂定为缓存错乱的问题。
解决办法:
搜索看了很多中文博客,大多数是Nginx与wp-super-cache的问题或WPMU与wp-super-cache的问题,抑或是301重定向失效的问题。结论是,中文找不到解决办法。
搜索英文看了很多网站,依然找到不解决办法,最后非常靠谱地回到了wp-super-cache插件的support form 里找到了解决的办法。结论是,越是高难的问题最有效的办法是看回其使用配置说明或官方支持,道听途说是没有用了,为这一结论,我浪费了一些时间。
这是一个漏洞,按知情人的原话是 “ this thread deals with the problem that is caused due to version 1.1 using $_SERVER[ ‘SERVER_NAME’ ] to generate the cache folder structure. Some web servers (nginx among them) does not create the variable $_SERVER[ ‘SERVER_NAME’ ] and therefore the cache will be generated and sent for the wrong site.”
根据我所看到的,解决办法一共有两个,一是用development version,下载地址为
http://downloads.wordpress.org/plugin/wp-super-cache.zip
亲测,问题已被解决,而且汉化做得更好。Version 1.1的最后修改时间为2012.6.12, development version的修改时间为 2012.9.12,估计很快会release的了。
第二个解决办法是最近一个星期发布的,修改Nginx里的nginx.conf 文件,增加以下代码
location ~ .php$ {
fastcgi_param SERVER_NAME $http_host;
}
我的解决办法肯定是第一个。看这个链接就靠谱。其次修改配置文件必须是一件谨慎的工作,你必须记住曾在默认文件中多加了些怎样的操作,也许改后可以解决的问题,但这样的改动很有可能影响以后别的插件或什么的运行。
这个问题解决后,剩下的配置就好办了。
我开启的是 mode_rewrite to service cache file 模式(最优的缓存模式),但我使用的不是Apache,是没有mod_rewrite这个模块的,.htaccess 配置文件安全无用。幸运的是网上流传了很多支持WP Super Cache 的配置文件,其中一份是这样的
location / {
# 如果请求的文件已存在,直接返回
if (-f $request_filename) {
break;
}
set $supercache_file '';
set $supercache_uri $request_uri;
set $supercache 1;
set $ihttp_host '';
if ($request_method = POST) {
set $supercache 0;
}
# 仅在访问文章永久链接时使用静态文件,请求中带参数则不使用静态缓存
set $qs 0;
if ($query_string) {
set $qs 1;
}
# 不过从 twitter, facebook, feedburner 链接点过来的,总是带参数,这些访问仍然可以使用静态文件
if ($query_string ~* "^utm_source=([^&]+)&utm_medium([^&]+)&utm_campaign=([^&]+)(&utm_content=([^&]+))?$") {
set $qs 0;
set $supercache_uri $document_uri;
}
#deactivate on high load
if ($qs = 1) {
set $supercache 0;
}
# 针对已登录用户(发表过评论),可以不静态化。在访问量高峰时可注释掉
if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
set $supercache 0;
}
# 支持移动设备,访问移动版本的网页缓存
if ($http_user_agent ~* '(iphone|ipod|aspen|incognito|webmate|android|dream|cupcake|froyo|blackberry9500|blackberry9520|blackberry9530|blackberry9550|blackberry 9800|webos|s8000|bada)') {
set $ihttp_host '-mobile';
}
# 指定静态缓存文件的路径
if ($supercache = 0) {
set $supercache_uri '';
}
if ($supercache_uri ~ ^(.+)$) {
set $supercache_file /wp-content/cache/supercache/$http_host$1/index${ihttp_host}.html;
}
# 只有当缓存文件存在时,才进行 rewrite
if (-f $document_root$supercache_file) {
#rewrite ^(.*)$ $supercache_file break;
rewrite ^ $supercache_file last;
}
# 所有其他请求,转给 wordpress 处理
if (!-e $request_filename) {
rewrite . /index.php last;
}
经过我的对比,对发表时间等一系列因素进行评估后,感觉这份Nginx rewrite 规则应该是比较新和靠谱的。把这代码加入到nginx.conf里面,之后再重启nginx,木有任何错误,大约也就木有什么问题了。
到期时间和垃圾回收器我的是默认的,同时也开启了CDN。在勾选了不要为已知用户缓存的情况下,wp-super-cache是不会生效的,查看网页源代码时会显示:
Page not cached by WP Super Cache. Check your settings page. Not caching requests by known users. (See Advanced Settings page)
如果插件正常运作,查看源码时则会显示:
Cached page generated by WP-Super-Cache on 2012-09-30 22:10:02
安装好后记得要按一下“立即预加载缓存”然后待上那么几分钟,再到“内容”查看有多少个缓存页面,感觉不完整则再按一次。否则的话,会出现首次访问会显示无法找到,刷新才有。
至此,在断熂续续折腾了两天后我终于顺利用上了wp-super-cache,也不是是不是平时实在是太慢了,现在感觉博客的确快了不少,现在几乎保持在半秒的水平。对于我这种对速度没大追求的人来说,算是可以了。
参考资料:
http://www.lovelucy.info/ngnix-config-support-wp-super-cache.html
貌似我把这个插件给关了~~(*^__^*) 嘻嘻……~~~买的空间是Apache的。好像没法改~
我前几天想开启多站点模式,就是应为部分插件在多站点内存在兼容问题,其中一个就是wp-super-cahce(主要原因还是这个插件!)最后还是选择用2个wp好了!虽然占用内存稍微大点,不过VPS还能承受!
那这个文章其实是说中了你的问题吧?因为我这文章中提到的版本就是专门解决兼容问题的。
[洋葱头19] 那时候我也搜索了好久,一直没有找到有效的方法。
要用GOOGLE搜索。 [洋葱头18]
搞了2天了,貌似还没搞出来。。。太尼玛麻烦了 [洋葱头19]