位置:GZ医疗队 > 公益纪实 > 公益站长 > 网络技术 >
WordPress 完全静态化后的 cookie 验证
来源: 作者: 点击:次 时间:2009-12-14
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 标签中加入:
<script type="text/javascript">var md5="<?php echo md5(get_settings('home')) ;?>";</script>
放心,虽然 md5 值是通过 PHP 函数计算得出,但静态页面中将直接保存这个值。
第二步才是关键,使用 JavaScript 验证 cookie。主要代码如下:
var cookies=document.cookie.split("; ");
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 中读出信息并填到框框里:
var cmtatr=null;
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,避免官方升级了,哈哈。