Wordpress二级域名共享用户cookie出现错误解决方案及WP的Cookie机制

简介:

在若干年以前,我刚开始折腾Wordpress没多久的时候,就自己摸索过 多个Wordpress网站共享一份数据表的实现方法 。这种看起来好像很高大上的类SSO功能,能够给用户在多个网站之间提供快速、无缝、透明的登录体验。

举个很简单的例子,原本有一个Wordpress网站 http://www.example.com(后称网站A) ,你突然想增加一个博客子站点 http://blog.example.com(后称网站B) ,那么原本在 网站A 注册的用户当然不想重新去 网站B 再次注册。这个时候就体现出本文要探讨的问题的价值了。

废话不多说,直接开始!

 

以下例子中所有的域名example.com请自行替换成你的域名

阅读本文的前提是你已经有基本的网站部署知识,会部署单个Wordpress网站,知道如何给Wordpress配置数据库信息,了解Wordpress目录结构。

 

部署网站A

  1. 如果还没有部署Wordpress,先按照常规方式下载源文件、配置环境(这里不赘述)。 记录好填入的数据库名、数据库用户名、数据库密码等信息,后续步骤要使用。 (备用数据A)

  2. 编辑 wp-config.php ,在任意位置添加如下内容:

define('COOKIE_DOMAIN', 'example.com');  
define('COOKIEPATH', '/');  

 

同时找到有一排形如 define('XXX_KEY', 'xxxasdas') 的内容(共8行),这里是设置一些salt,用来给cookie加密。如果没有也没有关系,有的话复制这些内容,下面的步骤要使用(备用数据B)。

部署网站B

  1. 在网站B的 wp-config.php 文件中,填写与网站A一致的数据库信息(备用数据A)

  2. 与网站A一样,在任意位置添加如下内容:

 define('COOKIE_DOMAIN', 'example.com');
    define('COOKIEPATH', '/');

 

  1. 若存在备用数据B(各种define的'XX_KEY'),将这些段落完整的粘贴到网站B的 wp-config.php 中。

  2. 将 $table_prefix = 'wp_'; 改为 $table_prefix = 'xxx_'; ( xxx 是任意不同于 wp 的字符串)

  3. 添加如下内容;

define('CUSTOM_USER_TABLE', 'wp_users');  
define('CUSTOM_USER_META_TABLE', 'wp_postmeta');  

 

关键步骤,修改Wordpress核心文件

我知道,这很恶心,但是我debug了一晚上后,已经实在没有精力去想一个优雅的解决方案了。请各位Wordpress达人提供一个hook吧……

按理说根据上述配置就可以实现用户在 www.example.com 登录后打开blog.example.com 也自动处于登录状态了,但是现实是无情的。即使你发现两个站点下均存在 wordpress_logged_in_xxxx 的cookie,但是Wordpress就是不能实现这个cookie,调用 is_user_logged_in() 也是返回false。

经过我各种跟踪调试,最终定位到内核文件 wp-includes/default-constants.php 中的一个常量 COOKIEHASH 是罪魁祸首。

源代码如下:

define( 'COOKIEHASH', md5( $siteurl ) );  

先提供解决方案,再讲原理

将 $siteurl 改成你的顶级域名字符串,即

define( 'COOKIEHASH', md5( 'example.com' ) ); 

这下整个世界都清爽了,cookie们终于愉快的在同一个域下同步了!

原理解释

为什么一个简单的常量会导致cookie同步失败呢?我们来逐层的恢复这个递归。

 

下面的这些函数并不是定义在同一个文件中,这里为了逻辑清晰将它们列在一起。

 

复制代码
define( 'COOKIEHASH', md5( $siteurl ) );  
...
define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);  
...
wp_parse_auth_cookie($cookie='', $scheme='');  
//该函数返回根据 $scheme 读取 $_COOKIE 中的内容并返回结果,
//这里的 $scheme 是常量 "logged_in",函数内部使用 switch
//将 "logged_in" map 到了 LOGGED_IN_COOKIE 这个常量
...
wp_validate_auth_cookie($cookie, $scheme)  
//根据上面的函数返回的结果,进一步判断cookie是否有效,并返回 user_id
...
add_filter( 'determine_current_user', 'wp_validate_auth_cookie',1);  
//定义了一个filter,当apply的时候执行上述函数
...
get_currentuserinfo()  
//这是很常用的一个内部函数,在这个函数里apply了上述filter
...
wp_get_current_user、is_user_logged_in等  
//这些函数都调用了上述函数
复制代码

 

分析到这里整个Wordpress的cookie解析流程也清晰了,问题很好定位,就是因为网站A 和 网站B 的 $siteurl 不同,导致常量定义不同,导致读不到cookie,最终导致了cookie不能跨子域共用。

以上。




本文转自黄聪博客园博客,原文链接:http://www.cnblogs.com/huangcong/p/5512592.html,如需转载请自行联系原作者

相关文章
|
存储 缓存 前端开发
WordPress缓存插件WP Fastest Cache插件使用教程
WordPress缓存插件WP Fastest Cache插件使用教程
783 0
|
JavaScript 前端开发 PHP
思否开源项目推介丨WP Editor.md:WordPress 下的 Markdown 编辑器插件
思否开源项目推介丨WP Editor.md:WordPress 下的 Markdown 编辑器插件
思否开源项目推介丨WP Editor.md:WordPress 下的 Markdown 编辑器插件
|
存储 JSON 缓存
捉虫与寻龙:从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud
关键字:wp2oc fileshare,wordpress媒体存进网盘,网盘作为wordpress图床,owncloud wordpress backend storage
680 0
捉虫与寻龙:从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud
WordPress – Logged In Users重复登录、疑似被黑,原来是Cookie问题
我的站点使用Ali云服务器,平时用Lenovo笔记本电脑连接服务器进行维护。笔记本电脑的固态硬盘C系统盘可用空间不到10G,所以周日花2~3个小时压缩了C,可用空间变成20G多。 不过WP登录后遇到问题,AIOWPS插件显示“Number of users currently logged into your site (including you) is: 2”红色警告,可我的站点只有我自己拥有管理员账户(没开放给其他用户注册)。
1675 0
图解 wp WordPress 文章 链接 在新窗口打开
wp WordPress 文章 链接 在新窗口打开 因为wp默认是不在新窗口打开链接的,这对于我们这样习惯关窗口的人,用起来很不方便。其实改起来很简单,下面开始 一、打开外观,选择编辑 二、打开主题页眉,header.
1289 0
删除WP提示:自动升级WordPress失败
wordpress后台总有烦人的升级失败的提示,查了半天找不到怎么去掉:“自动升级WordPress失败--请再试一次”这个提示的方法,特意分享出来   方法/步骤   1 打开wordpress根目录找到对应目录wp-admin\includes下 2 找打并打开update.php文件 3 将此语句删除或注释掉  echo "$msg";  4 回到后台主界面刷新,问题成功解决! END 注意事项   echo "$msg"; 在文件update.php中可能有两句,需要都注释掉。
1365 0
|
前端开发 数据安全/隐私保护
WordPress 用户管理插件 WP User Manager
WP User Manager 是一个较新的用户管理插件,可以在前端实现 用户注册、登录、找回密码、修改个人资料、修改密码等功能,如果你在找这方面的插件,WP User Manager 应该是一个不错的选择。
1907 0
WordPress SMTP发送邮件插件:WP SMTP
对于一个网站而言,发送邮件的功能是必不可少的,现在的主机一般都支持发送邮件,但是不同的主机由于函数限制或者某些其他原因,可能造成没办法正常发送邮件。这时候,我们可能就要借助第三方SMTP发送邮件。 对于使用WordPress建站的朋友来说,SMTP发送邮件的插件还是比较多的,功能大多类似,下面以WP SMTP为例讲解一下配置。
3374 0
|
JavaScript PHP 前端开发
WordPress匿名投稿插件:DX-Contribute(WP我要投稿,我要爆料)
倡萌在《WordPress添加投稿功能(无需注册/可邮件通知站长和投稿人) 》中分享过,通过修改主题文件实现游客快捷投稿的功能,但是有部分同学就是不太会动手,那么今天就分享一个WordPress匿名投稿插件:DX-Contribute,设置和使用都比较方便啦! DX-Contribute简介 DX-Contribute是一个wordpress投稿插件,主要功能如下: 允许游客无需注册即可在你的网站投稿。
1505 0
|
PHP 缓存
WordPress 技巧:禁用 WP Cron
我们知道 WordPress 有个进程专门用来在指定的时间周期或者将来的某个时间点运行特定的任务,比如定时发布某篇日志。这个功能 WordPress 是通过 WP-Cron 实现的,它会在每次你的博客有人访问或者在后台工作的时候,都会去检查当前是否有任务要执行。
898 0