如何将主域名的WordPress Cookie共享至所有子域名?
嘿,这个问题我之前帮别人处理过,其实就是调整WordPress的Cookie配置,再配合子站的验证逻辑就能搞定,一步步来:
1. 修改WordPress核心Cookie配置
WordPress默认的Cookie是绑定主域名的,得改成通配符域名让所有子域名都能识别。打开主站的wp-config.php文件,在/* That's all, stop editing! Happy publishing. */这行之前添加以下代码:
define('COOKIE_DOMAIN', '.hello.com'); define('COOKIEPATH', '/'); define('SITECOOKIEPATH', '/');
解释下:
.hello.com是通配符域名格式,意味着所有以hello.com为后缀的子域名(比如world.hello.com)都能读取这个CookieCOOKIEPATH和SITECOOKIEPATH设为/,确保Cookie在整个域名下的所有路径都生效
2. 强制更新登录时的Cookie域名
有时候WordPress不会自动更新已有Cookie的域名,所以我们可以加个钩子函数,在用户登录时强制把认证Cookie的域名改成通配符格式。打开当前主题的functions.php文件,添加这段代码:
add_action('set_auth_cookie', 'custom_auth_cookie_domain', 10, 3); function custom_auth_cookie_domain($auth_cookie, $expire, $user_id) { $cookie_domain = '.hello.com'; // 更新三个核心认证Cookie的域名 setcookie(SECURE_AUTH_COOKIE, $_COOKIE[SECURE_AUTH_COOKIE], $expire, COOKIEPATH, $cookie_domain, is_ssl(), true); setcookie(AUTH_COOKIE, $_COOKIE[AUTH_COOKIE], $expire, COOKIEPATH, $cookie_domain, is_ssl(), true); setcookie(LOGGED_IN_COOKIE, $_COOKIE[LOGGED_IN_COOKIE], $expire, COOKIEPATH, $cookie_domain, is_ssl(), true); }
这个函数会在用户登录触发set_auth_cookie动作时,重新设置三个核心认证Cookie的域名,确保子域名能正确读取。
3. 非WordPress子域名站点的登录状态验证
因为你的子站不是基于WordPress的,所以需要自己写逻辑来读取并验证主站的Cookie:
- 首先,子站可以读取主站的
wordpress_logged_in_xxxxxxCookie(这个名称里的哈希串是WordPress自动生成的,你可以在主站的wp-config.php里查看LOGGED_IN_COOKIE常量的值,或者直接通过$_COOKIE遍历找到) - 然后,子站需要验证这个Cookie的有效性:
- 最简单的方式是在主站开发一个自定义API接口,子站把Cookie内容发送给这个接口,主站内部调用WordPress的
is_user_logged_in()等函数验证,返回登录状态和用户信息 - 如果子站和主站在同一服务器,也可以直接连接WordPress的数据库,通过Cookie里的用户ID和哈希值去
wp_usermeta表验证,但这种方式要注意数据库连接的安全性,避免泄露敏感信息
- 最简单的方式是在主站开发一个自定义API接口,子站把Cookie内容发送给这个接口,主站内部调用WordPress的
安全注意事项
- 一定要使用HTTPS协议!上面的代码里
is_ssl()会把Cookie标记为Secure,只有HTTPS传输才会发送Cookie,避免被窃听 - Cookie里的哈希值是加密的,不要尝试在子站直接解密,最好通过主站的接口来验证
- 如果主站启用了双因素认证,子站的验证逻辑也要考虑这一点,确保只有通过双因素的用户才被认定为已登录
内容的提问来源于stack exchange,提问作者Youz
相关产品推荐
相关产品推荐

