黄聪: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
如果还没有部署Wordpress,先按照常规方式下载源文件、配置环境(这里不赘述)。 记录好填入的数据库名、数据库用户名、数据库密码等信息,后续步骤要使用。 (备用数据A)
编辑
wp-config.php
,在任意位置添加如下内容:
- define('COOKIE_DOMAIN', 'example.com');
- define('COOKIEPATH', '/');
同时找到有一排形如 define('XXX_KEY', 'xxxasdas')
的内容(共8行),这里是设置一些salt,用来给cookie加密。如果没有也没有关系,有的话复制这些内容,下面的步骤要使用(备用数据B)。
部署网站B
在网站B的
wp-config.php
文件中,填写与网站A一致的数据库信息(备用数据A)与网站A一样,在任意位置添加如下内容:
- define('COOKIE_DOMAIN', 'example.com');
- define('COOKIEPATH', '/');
若存在备用数据B(各种define的'XX_KEY'),将这些段落完整的粘贴到网站B的
wp-config.php
中。将
$table_prefix = 'wp_';
改为$table_prefix = 'xxx_';
(xxx
是任意不同于wp
的字符串)添加如下内容;
- 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.tuicool.com/articles/bUbqem
黄聪:Wordpress二级域名共享用户cookie出现错误解决方案及WP的Cookie机制的更多相关文章
- 顶级域名和二级域名共享cookie及相互删除cookie
在CSDN看到一个cookie设置domain时,如何删除的问题, 自己也只知道domain设置为顶级域名时可以被其他二级域名共享,但是如何删除还是有一点搞不清楚,所以特意测试了下cookie和dom ...
- asp.net基于StateServer的二级域名共享session
备注:亲自试验有效,如果网友有通过下面的教程未实现session共享的,欢迎留言说明你遇到的问题.必有回复. 最近为实现的二级域名共享session纠结好久.网上的很多实现的方法试了都不行,查了很久才 ...
- .NET二级域名共享Session
ASP.NET二级域名站点共享Session状态 今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session. 首先, Session要共享,站点之间SessionID必须要 ...
- 设置二级域名共享一级域名Cookie和删除共享Cookie
设置共享Cookie: 二级域名要想共享一级域名的cookie,只需要设置cookie.Domain = ".一级域名.com"; 删除共享Cookie: HttpCook ...
- PHP实现同服务器多个二级域名共享 SESSion
现在很多分类信息网站都会分出很多个二级域名出来,比如:sh.ganji.com(上海赶集网), su.ganji.com(苏州赶集网)等等,像这种拥有多个二级域名的网站,该如何实现同步共享sessio ...
- Froms 认证 二级域名共享session登录凭证
1. 需要共享的web.config 里需要加添 <authentication mode="Forms"> <forms name="/> &l ...
- 黄聪:iis7.5 偶尔出现500服务器错误-内部服力器错误
搞了半天,发现是PHP映射模块出错了,最新的PHP7处理模块不行,换成5.6的就好了
- 黄聪:Mysql开启InnoDB引擎出现1067错误的解决办法
在my.ini文件添加下面这行: innodb_force_recovery = 1 可以解决:InnoDB: Attempted to open a previously opened tables ...
- WordPress 设置GeoIP数据库目录权限时错误解决方案
存在一个问题 更新完WP-statistics后,不知道为什么出现了一个错误提示:设置GeoIP数据库目录权限时错误,请确保您的Web服务器有权限写入到目录/var/www/html/wordpres ...
随机推荐
- Octopus系列之数据上传格式要求说明
各个数据列要求 价格列:字符串类型[美元价格] 产品名字:可以支持"/"等字符 分类名字:去空格处理 不得包含"&"符号 主图:一定要有主图列 不为空 ...
- JavaScript整合
JavaScript已经学完了,总体感觉良好,但是突然发现原来JS可以做的东西比我想象的还要多!我整理了一些JavaScript的基础知识,这些内容掌握好的话,对我们深入学习JavaScript会有很 ...
- 警惕USB键盘记录器
最近媒体报道了一种新型的能记录账号.密码输入的“USB键盘记录器”,引发网友关注,该设备看上去和普通U盘没什么区别,将其插入电脑USB接口,然后把键盘线和它连接,该设备就能够自动记录用户在电脑上输入的 ...
- 简单研究Android View绘制二 LayoutParams
2015-07-28 17:23:20 本篇是关于LayoutParams相关 ViewGroup.LayoutParams文档解释如下: LayoutParams are used by views ...
- 计算机网络(3)-----IP数据报格式
IP数据报(IP Datagram) 格式 解析 (1)版本 占4位,指IP协议的版本.通信双方使用的IP协议版本必须一致.目前广泛使用的IP协议版本号为4(即IPv4). (2)首部长度 占4位,可 ...
- Ubuntu-搜狗输入法
Sougou(搜狗):要换fictx输入法,先删除ibus输入法.搜索sudo apt-get purge ibussudo apt-get autoremove 然后安装fcitx和拼音输入法(要安 ...
- .NET/android/java/iOS AES通用加密解密
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...
- CSS3-Media Query 基础
一.常见的属性: device-width , device-height 屏幕宽高 width , height 渲染窗口宽高 orientation 设备方向 resolution 设备分辨率 二 ...
- (转)javascript匿名函数的写法、传参和递归
(原)http://www.veryhuo.com/a/view/37529.html (转)javascript匿名函数的写法.传参和递归 http://www.veryhuo.com 2011-0 ...
- mac 下配置protobuf 3.0 golang环境
protobuf 3.0 与 之前的 protobuf 2.6 的语法是不一样的.需要重新安装一下,本机的环境是 OS X Yosemite 10.10.2 1. 不采用home brew安装,用 ...