页面载入中...

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 标签中加入:

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

29条留言. 发言 or Trackback

  • cosbeta  17:57 Feb 26, 2009 

    cos-html-cache直接把js 提到独立的js文件中了 HASH通过 get方式传递过去的

  • Jason+Ng  18:09 Feb 26, 2009 

    安装hyper cache 1个多小时后,数据库查询量依然没有减少,最终我决定尝试cos html cache,目前还在观察。

  • 北极冰仔  18:19 Feb 26, 2009 

    @cosbeta 有时间得好好向大侠学习一下:)

  • 北极冰仔  18:22 Feb 26, 2009 

    @Jason+Ng Hyper Cache 毕竟还是依赖 WordPress 插件机制,在这种方式下不可避免还会产生数据库查询。另外这个 JavaScript 改起来说麻烦吧不麻烦,不麻烦吧还小麻烦,不如直接使用 cos-html-cache,呵呵。

  • cosbeta  18:40 Feb 26, 2009 

    关于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单独处理

  • 北极冰仔  18:55 Feb 26, 2009 

    @cosbeta 晕,WordPress 不会只是把原来的 admin cookie 改了个名字吧?不知道哪个版本开始发现失效之后我就没管了……谢谢 cos 大侠,哈哈。

  • 小7  23:01 Feb 26, 2009 

    Hyper Cache下admin访问不是不会激活Hyper么

  • 北极冰仔  23:07 Feb 26, 2009 

    @小7 其实 Admin cookie 不算什么大问题,我这里至今也没有搞这个,主要解决了访客 cookie 问题就好啦:) :em17:

  • Noratis  20:44 Feb 28, 2009 

    嗯,今天又学习了新东西了。谢谢博主。

  • David  19:10 Mar 09, 2009 

    我的blog在 游客直接评论的时候 可以评论 但是不自动填入名字等
    但是这样还能评论
    当我改成只能注册用户评论的时候
    用firefox登录后没有效果。
    就是说cookies不登录
    而ie没有问题的。
    请问,这个是怎么回事呢? :em13:

  • 北极冰仔  20:52 Mar 09, 2009 

    @David 听上去倒像是你的 WordPress 出问题了,IE 清掉所有 cookie 后再登录能成功吗?另外你没有使用静态化插件的吧?

  • shamas  15:55 Mar 26, 2009 

    那个第二步的代码要放在什么位置啊

  • 北极冰仔  17:06 Mar 26, 2009 

    @shamas
    直接写在 comments.php 文件中就行了,如果你有“洁癖”,拿出来单独写一个 .js 文件再通过 script 标签引入也是一样的。

  • everpg  19:14 Apr 20, 2009 

    恩,我使用inove 的主题 第二步的是放在comments.php 文件头,还是尾巴?

  • 北极冰仔  20:41 Apr 20, 2009 

    @everpg 写在头部好了。

  • Lwy  21:57 Apr 28, 2009 

    似乎非常有用。。。感谢

  • 店小二  02:35 May 09, 2009 

    郁闷啊,我将步骤二的代码贴到comments.php中后,打开文章这些代码居然在浏览器中显示出来了,查看源码也是红色错误高亮度显示。不知道是怎么啦?我用的是hyper cache 希望博客能够抽空回复一下。

  • 北极冰仔  09:33 May 10, 2009 

    @店小二 前后要用 script 标签,<script type=”text/javascript”>….</script;>

  • 北极冰仔  09:34 May 10, 2009 

    上面多了个分号

  • 店小二  09:37 May 10, 2009 

    收到,问题已解决,谢谢!

  • xuanwobbs  15:12 Jun 20, 2009 

    从Sablog换到WordPress
    用了Hyper Cache
    怎么搞都失效…试了好久了..

  • paladin  17:35 Jul 02, 2009 

    不错的内容,收藏了 :em01:

  • houkai  22:25 Aug 06, 2009 

    sdfsdfasdf

  • gdsfj  17:19 Aug 18, 2009 

    :em06: :em06: :em06: :em06: :em06:

  • houkai  21:42 Oct 01, 2009 

    写入函数在那?? :em19:

  • Ciel Chan  01:13 Dec 16, 2009 

    :em13: :em13: :em13: :em13: 我也不知道写哪里…把模板都搞坏了…汗~~~~ 不过修好了…

  • Ciel+Chan  01:31 Dec 16, 2009 

    有没有简单的方法啊?

  • Ciel+Chan  01:49 Dec 16, 2009 

    可不可以吧单独的 JS文件的方法 详细的告知一些哦 谢谢咯…

  • Rtrash|废纸篓  00:36 Dec 30, 2009 

    @cosbeta
    :em21: 好强大的代码,解决了IE下面无法提交留言的问题。默认的cache/common.js.php;在IE会提示name is necessary;

留言 ↓

欢迎回来, (修改)

  • :em19:
  • :em01:
  • :em25:
  • :em09:
  • :em11:
  • :em00:
  • :em13:
  • :em08:
  • :em10:
  • :em03:
  • :em02:
  • :em05:
  • :em07:
  • :em16:
  • :em27:
  • :em14:
  • :em21:
  • :em20:
  • :em24:
  • :em18:
  • :em17:
  • :em06:
  • :em23:
  • :em12:
  • :em22:
  • :em15:
  • :em26:
  • :em04:

正在提交数据...

5 Pingbacks & Trackbacks