February 26, 2009
WordPress 完全静态化后的 cookie 验证
Kenengba 是又一个高流量的 WordPress 博客,在使用 Hyper Cache 缓存插件后发现访客的 cookie 失效了——这很正常,完全静态化的页面不借助 JavaScript 确实无法验证 cookie——没有使用完全静态化 WordPress 缓存插件(如:cos-html-cache、Hyper Cache)的同学就不需要往下看了。
直奔主题吧,下面介绍一下使用 JavaScript 验证 cookie 的方法需要说明的是,我这篇日志不是完整的解决方案,只能解决访客(非 WordPress Admin)cookie 失效问题,由于自身水平有限,Admin 的 cookie 验证我还不会,WordPress 在最近的版本中做了修改,一直懒得去管。不过也有折衷的偷懒办法可以弥补这点小问题。如有错误之处请大家指正。
普通留言者的 cookie 是在提交留言的时候产生的,一共有三个:comment_author_(md5), comment_author_email_(md5), comment_author_url_(md5),分别记录访客留言前填写的称呼、电邮地址、网址。(md5) 是博客首页 URL 的 md5 值(是不是 double md5?忘了),例如本站对应的 md5 值为 f78634f9b4fec520be07d54c3fdefdfb,把它代入上面的括号就得到了这三个 cookie 的名字。
那么,第一步就是在静态化页面中用一个 JavaScript 变量保存 md5 值。本站的做法是在 header.php 模板 head 标签中加入:
放心,虽然 md5 值是通过 PHP 函数计算得出,但静态页面中将直接保存这个值。
第二步才是关键,使用 JavaScript 验证 cookie。主要代码如下:
function GetCookieValue(cookieName){
var ret=null;
for(var i=0;i<cookies.length;i++){
var crumbs=cookies[i].split("=");
if(cookieName==crumbs[0]){
ret=unescape(decodeURI(crumbs[1]))
}
}
return ret
}
GetCookieValue() 函数的参数是 cookie 的名称,如果此 cookie 存在则返回 cookie 值,否则返回 null。
假设你的 comments.php 模板中填写留言者信息的三个 input ID 分别为 author, email, url,下面代码的功能就是从 cookie 中读出信息并填到框框里:
document.getElementById('author').value="";
document.getElementById('email').value="";
document.getElementById('url').value="";
if((cmtatr=GetCookieValue("comment_author_"+md5))!=null){
document.getElementById('author').value=cmtatr;
document.getElementById('email').value=GetCookieValue("comment_author_email_"+md5);
document.getElementById('url').value=GetCookieValue("comment_author_url_"+md5)
}
第三步,为了避免静态化插件把前一个留言者的个人信息直接写在缓存中,修改 comments.php 中的留言框,把三个 input 的 value 属性都改为 "",原来写在中间的 PHP 代码删掉。
做完以上三步就基本完成了 cookie 验证的功能,完全静态化后的 WordPress 也可以记住每个留言者(除 Admin 本人外)了。那么怎么样才可以连 Admin 也记住呢?正统的方法我没有去想,你猜我是怎么做的?退出管理员,以普通访客身份留一次言,当然名字、邮件、网址得和管理员身份一样才行哈。
不知道有什么细节落掉没有,先写到这里吧。另外,我上面写的这些东西就是 cos-html-cache 采用的 cookie 验证方式,旧版是这样,新版就不清楚了,我是个很懒的人,我在 cos-html-cache 2.3 版基础上做了自己的修改后直接把版本号改为 2008,避免官方升级了,哈哈。

cos-html-cache直接把js 提到独立的js文件中了 HASH通过 get方式传递过去的
安装hyper cache 1个多小时后,数据库查询量依然没有减少,最终我决定尝试cos html cache,目前还在观察。
@cosbeta 有时间得好好向大侠学习一下:)
@Jason+Ng Hyper Cache 毕竟还是依赖 WordPress 插件机制,在这种方式下不可避免还会产生数据库查询。另外这个 JavaScript 改起来说麻烦吧不麻烦,不麻烦吧还小麻烦,不如直接使用 cos-html-cache,呵呵。
关于admin的cookie,你看看我的function setCommForm(){
if( admin_user_cookie.length > 2){
setovalue(‘author’,admin_user_cookie.split(“|”)[0]);
setovalue(‘email’,adminmail.replace(“{_}”,”@”) );
setovalue(‘url’,adminurl );
}else{
setovalue(‘author’,readCosBetaCookie(author_cookie) );
setovalue(‘email’,readCosBetaCookie(email_cookie) );
setovalue(‘url’,readCosBetaCookie(url_cookie) );
}
}
哈哈 admin的cookie单独处理
@cosbeta 晕,WordPress 不会只是把原来的 admin cookie 改了个名字吧?不知道哪个版本开始发现失效之后我就没管了……谢谢 cos 大侠,哈哈。
Hyper Cache下admin访问不是不会激活Hyper么
@小7 其实 Admin cookie 不算什么大问题,我这里至今也没有搞这个,主要解决了访客 cookie 问题就好啦:)
嗯,今天又学习了新东西了。谢谢博主。
我的blog在 游客直接评论的时候 可以评论 但是不自动填入名字等
但是这样还能评论
当我改成只能注册用户评论的时候
用firefox登录后没有效果。
就是说cookies不登录
而ie没有问题的。
请问,这个是怎么回事呢?
@David 听上去倒像是你的 WordPress 出问题了,IE 清掉所有 cookie 后再登录能成功吗?另外你没有使用静态化插件的吧?
那个第二步的代码要放在什么位置啊
@shamas
直接写在 comments.php 文件中就行了,如果你有“洁癖”,拿出来单独写一个 .js 文件再通过 script 标签引入也是一样的。
恩,我使用inove 的主题 第二步的是放在comments.php 文件头,还是尾巴?
@everpg 写在头部好了。
似乎非常有用。。。感谢
郁闷啊,我将步骤二的代码贴到comments.php中后,打开文章这些代码居然在浏览器中显示出来了,查看源码也是红色错误高亮度显示。不知道是怎么啦?我用的是hyper cache 希望博客能够抽空回复一下。
@店小二 前后要用 script 标签,<script type=”text/javascript”>….</script;>
上面多了个分号
收到,问题已解决,谢谢!
从Sablog换到WordPress
用了Hyper Cache
怎么搞都失效…试了好久了..
不错的内容,收藏了
sdfsdfasdf
写入函数在那??
有没有简单的方法啊?
可不可以吧单独的 JS文件的方法 详细的告知一些哦 谢谢咯…
@cosbeta
好强大的代码,解决了IE下面无法提交留言的问题。默认的cache/common.js.php;在IE会提示name is necessary;