粤ICP备11076303号  广州青年志愿者协会医疗服务总队 www.gzyld.org.cn
加入医疗队
加入志愿者

位置: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,避免官方升级了,哈哈。

    新活动 回顶部
    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    验证码: 点击我更换图片
    最新评论 进入详细评论页>>