在多站点共用一套账号体系的项目里,经常遇到这样的情况:用户在www.bbccb.com登录成功后,跳转到bbs.bbccb.com或shop.bbccb.com,登录状态却丢失了,页面又显示成未登录。问题的根源在于Cookie默认只对写入它的那个域名可见,浏览器在发送请求时只会携带与当前域名匹配的Cookie。要解决这一问题,只需要在写入Cookie时显式指定domain为父域名,所有二级域名就能共享同一份登录凭证。本文以jQuery Cookie插件为例,完整讲解domain参数的配置方法和排查思路。

一、先搞清楚Cookie的domain匹配规则
浏览器对Cookie的可见性判断遵循一套简单但容易被忽视的规则:如果不设置domain属性,Cookie默认只属于当前访问的完整域名,也就是所谓的主机专用Cookie(host-only cookie)。比如页面在www.bbccb.com下通过$.cookie写入了一个token,且没有指定domain,那么这个Cookie的domain字段就是www.bbccb.com,只有在访问www.bbccb.com及其下级路径时才会被携带,bbs.bbccb.com完全读不到它。
而如果在写入Cookie时显式设置了domain=.bbccb.com(或者写bbccb.com,现代浏览器会自动补全匹配规则),浏览器就会把这个Cookie视为域名Cookie,所有以bbccb.com结尾的子域名在发请求时都会带上它,包括www.bbccb.com、bbs.bbccb.com、api.bbccb.com等。这就是跨二级域名共享登录状态的理论基础:登录凭证只需要写一次,全站子域名都能识别。
需要特别注意的一点是,domain只能设置为当前域名的上级或本级,不能设置为毫无关系的域名,也不能设置为公共后缀。例如页面运行在www.bbccb.com上,你可以把domain设为www.bbccb.com或bbccb.com,但绝不能设成example.org,浏览器会直接拒绝写入。同样,试图把domain设为.com这种顶级域也是无效的,这是浏览器安全机制强制约束的,任何前端技术都绕不开。
二、jQuery Cookie插件的domain参数配置写法
jQuery Cookie插件提供了$.cookie方法,第二个参数是值,第三个参数是一个配置对象,其中就包含domain选项。正确的跨二级域名写法如下:
// 登录成功后写入共享Cookie
$.cookie('token', 'user_login_token_xxx', {
domain: 'bbccb.com', // 关键:设置为父域名,所有二级域名可见
path: '/', // 路径设为根目录,全站路径可用
expires: 7, // 有效期7天
secure: false // HTTPS站点建议设为true
});
// 在任意二级域名页面读取,例如bbs.bbccb.com
var token = $.cookie('token');
if (token) {
console.log('登录状态有效:' + token);
}这里有两个参数缺一不可。domain设为父域名是跨子域共享的核心,path设为/则保证Cookie在整个站点的所有路径下都可用。如果path没有显式指定,插件默认值就是/,一般不会有问题,但显式写出来可以避免后续维护时的歧义。
删除Cookie时有一个非常容易踩坑的地方:删除操作必须带上与写入时完全一致的domain和path,否则删除会静默失败。也就是说,你在bbs.bbccb.com页面下执行$.removeCookie,如果只写$.removeCookie('token')而不带domain参数,插件实际是在尝试删除bbs.bbccb.com域名下的token,而这个Cookie原本属于bbccb.com作用域,自然删不掉。正确写法如下:
// 退出登录时删除共享Cookie,参数必须与写入时一致
$.removeCookie('token', {
domain: 'bbccb.com',
path: '/'
});
// 检查删除是否成功,成功返回true
if ($.removeCookie('token', { domain: 'bbccb.com', path: '/' })) {
console.log('已成功清除登录状态');
}三、配置后仍然无法共享的排查方法
如果按照上面的写法配置了domain,子域名还是读不到Cookie,建议按以下顺序逐一排查。第一个检查点是写入时机,确认写入Cookie的代码确实在登录成功回调中执行了,可以在浏览器开发者工具的Application面板中查看Cookie列表,找到对应条目后确认其Domain列显示的是bbccb.com而不是www.bbccb.com,后者说明domain参数没有生效。
第二个检查点是作用域本身是否一致。有些项目在不同子域名下分别部署了前端代码,各自都调用$.cookie写入同名Cookie但domain不同,就会产生两份同名不同域的Cookie,读取时可能拿到旧的那份。这种情况需要在Application面板里删除全部同名Cookie后重新登录测试。第三个检查点是协议差异,如果主站是HTTPS而某个子域名还是HTTP,且写入时设置了secure为true,那么HTTP子域名下浏览器不会回传这个Cookie,解决办法是把子域名也升级为HTTPS,这是目前主流的推荐做法。
最后还要理解一个边界限制:domain参数只能解决同一主域名下二级域名之间的共享,属于跨子域(cross-subdomain),而不是跨域(cross-origin)。bbccb.com和另一个完全不同的域名之间无法通过Cookie的domain配置共享任何状态,那种场景需要走单点登录方案,例如基于OAuth2的统一认证中心或者JWT配合重定向的CAS流程。把这两类问题的边界分清楚,能避免在错误的方向上浪费时间。本地开发时还有一个小细节,localhost环境下domain只能写localhost,无法模拟子域名共享效果,建议通过修改hosts文件把127.0.0.1映射为www.test.local和bbs.test.local这类自定义域名来验证配置是否正确。
jQuery Cookiedomain参数跨二级域名修改时间:2026-09-16 16:36:37