cookies设置域名时子域名主域名怎么共享?, 如何设置cookie跨域共享?

子域名和主域名的Cookie默认互不共享,想要共享必须显式设置Domain属性

Cookie的共享规则取决于Domain属性设置,默认情况下,浏览器只允许Cookie绑定到设置它的那个域名,子域名和主域名之间互不相通,要想让主域名和所有子域名共享Cookie,必须在写入Cookie时显式指定Domain为主域名(例如.example.com),这样包括www.example.comblog.example.com在内的所有子域名都能读取这个Cookie,反过来,子域名设置的Cookie如果不带Domain属性,主域名和其他子域名都无法访问它。

写代码时被跨域问题折腾过的人,多数都踩过Cookie共享的坑,这篇文章把主域名、子域名之间的Cookie共享机制讲透,包括具体配置方法、常见坑位,以及HttpOnly、Secure等属性对共享的影响。

前端Cookie手把手教程
加载中
前端Cookie手把手教程

从一次真实登录场景说起

假设你有两个站点:www.example.comblog.example.com,用户在www登录,跳转到blog时发现又变成未登录状态,为什么?因为www写入的Cookie默认只属于www.example.com,浏览器访问blog.example.com时根本不会携带这个Cookie。

理解这个现象之前,先搞清楚Cookie归属权的底层规则域名匹配算法,浏览器判断是否发送某个Cookie,不只看域名是否相等,而是看请求域名是否“域匹配”Cookie的Domain属性。

h2: Cookie的Domain属性怎么影响子域名和主域名共享?

Cookie在写入时可以携带一个Domain属性,它决定了这个Cookie的作用范围,规则如下:

  • 如果不设置Domain,Cookie仅作用于当前精确域名,所有子域名都不共享。
  • 如果设置Domainexample.com,则example.com以及它所有的子域名(wwwblogapi等)都能读取。
  • 如果子域名设置Domainblog.example.com,则只有blog.example.com及其更深层子域名(如news.blog.example.com)能读取,www和主域名都不行。

行业共识是:共享Cookie的核心就一句话写入时把Domain设为根域名

主域名和子域名共享Cookie的三种场景

场景 目标 设置Domain 示例
主域名登录,子域名也要登录态 全站共享 .example.com 登录example.comblog.example.com也有效
子域名登录,主域名也要登录态 主域名能读 .example.com api.example.com写入,example.com可读
仅子域名之间共享 部分子域共享 .sub.example.com或具体子域 a.sub.example.comb.sub.example.com共享

第一种场景最常见,实际操作时要特别注意:Domain属性必须包含至少一个点号,也就是说,如果你写Domain=example.com(没有点),大多数现代浏览器会拒绝它,或者把它忽略并按默认规则处理,规范要求Domain值必须是“可注册域名”的后缀,通常写成.example.com(前面加点)更稳妥。

如何设置Domain属性?前端后端都要会

后端设置(以Node.js/Express为例)

cookies设置域名时子域名主域名怎么共享?, 如何设置cookie跨域共享?

res.cookie('token', 'abc123', {
  domain: '.example.com',  // 注意前面的点
  path: '/',
  httpOnly: true,
  secure: true,
  sameSite: 'lax'
});

后端设置(以Python Flask为例)

resp.set_cookie('token', 'abc123', domain='.example.com', path='/', httponly=True, secure=True)

前端设置(JavaScript)

document.cookie = "token=abc123; Domain=.example.com; Path=/; Secure; SameSite=Lax";

这里的关键点是:前端JS设置Cookie,尽管指定了Domain=.example.com,浏览器仍然遵守同站策略。只要页面本身在www.example.comblog.example.com上,就可以设置属于.example.com的Cookie,但是如果页面的域名与指定的Domain不匹配(比如在other.com页面上设置.example.com的Cookie),浏览器会直接拒绝。

子域名和主域名共享Cookie时容易踩的坑

  • Path属性忘了写或写错,如果只设置DomainPath默认是,那没问题,但如果设置Path=/admin,其他路径的页面拿不到Cookie。
  • Secure属性在HTTP环境下失效,如果Cookie设置了Secure但当前站点是HTTP协议,浏览器不会存储这个Cookie,本地开发时尤其容易遇到。
  • SameSite属性影响跨站发送SameSite=Lax默认允许同站(包含同一主域下的子域名)发送,但如果设成Strict,从blog.example.com跳转到www.example.com时,Cookie不会携带,表现就是“登录状态丢失”。
  • 子域名覆盖问题,如果wwwblog分别写了不同Domain的Cookie,且Cookie名相同,浏览器会同时存储两个Cookie,请求哪个域名就带哪个Cookie,可能造成数据混乱。

h2: 子域名和主域名Cookie共享失败怎么排查?从浏览器开发者工具查起

很多人在生产环境发现共享不了,第一反应是改代码,结果反复试都不行,80%的失败都能在浏览器里直接看出来。

打开Chrome开发者工具的Application面板,左侧找到Cookies,点击https://example.comhttps://blog.example.com分别查看,你会看到两个域名下各自存储的Cookie列表,如果www登录后,blog的Cookie列表里没有对应的token,说明写入时Domain没设对。

实际问题定位路径

  1. 确认写入时的Domain值,在Network面板里找到Set-Cookie响应头,查看Domain属性实际是什么,如果只有Set-Cookie: token=xxx没有Domain,那就是默认绑定当前域名,共享失败。
  2. 确认请求是否携带Cookie,看blog.example.com的请求头有没有Cookie字段,如果没有,说明浏览器认为这个Cookie不属于blog
  3. 检查浏览器存储的总数,Chrome限制每个域名最多180个Cookie,如果超了会静默丢弃,阈值在较新版本的Chrome中更严格,超过限制后老Cookie被清除。
  4. 检查Cookie的过期时间,Session Cookie(未设置Expires或Max-Age)在浏览器关闭后消失,如果共享需求跨会话,必须设置过期时间。

使用curl验证共享逻辑

如果你不想打开浏览器,用curl也可以模拟验证Cookie行为,先向登录接口发起请求,保存Cookie:

cookies设置域名时子域名主域名怎么共享?, 如何设置cookie跨域共享?

curl -c cookies.txt -X POST https://www.example.com/login

然后携带Cookie访问子域名:

curl -b cookies.txt https://blog.example.com/profile

如果cookies.txt里的Domain字段是.example.com,那么在请求blog时curl会自动发送这个Cookie,如果Domainwww.example.com,则不会发送,这个方法能快速判断服务端是否正确配置了Domain属性。

h2: 不考虑共享的Cookie怎么设置更安全?

并非所有业务都需要主域名和子域名共享Cookie,比如api.example.com专门处理敏感接口,你希望普通子域名页面无法读取这个接口的Cookie,那就不要设置Domain,让它默认绑定api.example.com,这样可以缩小Cookie的暴露面,减少CSRF攻击风险。

业内专家指出(仅用一次):Cookie的共享范围越大,被第三方脚本窃取的风险就越高,网站遇到XSS漏洞时,恶意脚本通常只能读取当前域名下可访问的Cookie,如果把所有Cookie都设成根域名共享,那么任意一个子域名被注入脚本,所有子域名的Cookie都会泄露。

针对不同nginx子域名场景,Cookie怎么取舍?

常见的部署结构里,前端站点是www.example.com,后端API是api.example.com,如果用户登录后需要前端调用API,通常有两种方案:

  1. API的Cookie也不设Domain,但前端请求通过全站域名的反向代理同源,比如www.example.com/api/反代到内网API服务器,浏览器看到的是同一个域名,Cookie自然携带。
  2. API的Cookie设置Domain为.example.com,此时所有子域名的页面都能携带这个Cookie到API接口,前提是你确信所有子域名都是可信的。

推荐方案1,虽然方案2配置简单,但它让blog.example.com这种静态站点也持有API域名的Cookie,如果静态站点被上传恶意文件,风险更大,行业共识是:尽量用同源代理,不要用Domain属性扩大范围。

h2: Cookie共享和CSRF、XSS攻击的关系安全性怎么权衡?

共享Cookie时,必须处理好安全属性。HttpOnly能防止JavaScript读取Cookie,Secure保证Cookie只在HTTPS下传输,SameSite限制跨站请求携带Cookie,这三者缺一不可。

在三方Cookie被各大浏览器逐步淘汰的今天,很多站点考虑用SameSite=None; Secure来跨站携带Cookie,但请注意:SameSite=None用于跨站(比如example.com访问api.other.com),不适用于同站不同子域名,同站(site)的定义是协议、端口、可注册域名都相同,子域名不同也算同站,所以你的子域名共享场景,应该使用SameSite=LaxStrict,不要设置None

如何设置HttpOnly和Secure让共享Cookie更安全?

以Java Servlet为例,设置响应头:

response.addHeader("Set-Cookie", "token=abc123; Domain=.example.com; Path=/; HttpOnly; Secure; SameSite=Lax");

用Spring Boot则更简洁:

ResponseCookie cookie = ResponseCookie.from("token", "abc123")
    .domain(".example.com")
    .path("/")
    .httpOnly(true)
    .secure(true)
    .sameSite("Lax")
    .build();

上述代码同时设置了

cookies设置域名时子域名主域名怎么共享?, 如何设置cookie跨域共享?

HttpOnlySecureHttpOnly确保document.cookie无法读出该Cookie,即使子域名页面被注入XSS脚本,攻击者也只能通过伪造请求的方式利用,无法直接窃取值。

h2: 本地开发调试时,localhost和子域名怎么共享Cookie?

本地开发经常用localhost模拟主域名,用myapp.test模拟子域名,这里有两个常见问题:

  • Domain=localhost合法吗?不合法,大多数浏览器要求Domain属性必须包含至少一个点号,localhost只有一个标签,会被拒绝,所以如果前端跑在localhost:3000,后端跑在localhost:8080,它们之间Cookie共享靠的是同Host不同端口,端口不影响Cookie域名,所以只要把Cookie写到localhost(不设置Domain即可),两个端口能共享。
  • 如果非要模拟子域名场景,推荐用nip.io或其他通配域名解析服务,把example.comblog.example.com都指向0.0.1,在/etc/hosts里手动加也行:
0.0.1 example.com
127.0.0.1 blog.example.com

然后在代码里把Cookie的Domain设为.example.com,浏览器就会把它们当作同站处理,注意:.example.com这种正式后缀在国内需要备案,本地测试没问题,生产环境请使用你实际注册的域名。

一个典型问题:用户在www子域名登录了,主域名example.com却拿不到Cookie

很多网站在做整站迁移时,把原页面从www.example.com跳转到example.com,结果登录状态全丢,排查过程如下:

  1. 检查重定向响应头里是否有Set-Cookie,如果重定向发生在服务端,且原服务在响应中设置了Domain=.example.com,浏览器会存储,然后跟随重定向访问example.com时携带Cookie,登录态应该保持。
  2. 如果重定向用JS在浏览器端跳转,且页面未加载完就执行window.location,可能把未设置的Cookie丢掉。
  3. 如果登录接口返回的Cookie没有Domain,只有www.example.com,那跳转后自然丢失。修复方式:在登录接口和所有写Cookie的后端代码中统一加上.example.com

h2: Q&A:关于cookies设置域名时,子域名和主域名怎么共享的常见问题

问题1:子域名能否读取主域名设置的Cookie?

不能,除非主域名写入Cookie时把Domain设为.example.com,如果主域名不设置Domain,Cookie只属于example.com本身,所有子域名(包括www)都无法读取。

问题2:在子域名写入Cookie,主域名能读到吗?

同样不能,除非子域名写入时把Domain设为根域名.example.com,例如在blog.example.com页面执行document.cookie="token=x; Domain=.example.com; Path=/;",然后访问example.com就能读到这个Cookie。

问题3:如果两个子域名设置了相同名称但不同Domain的Cookie,会发生什么?

浏览器会把它当成两个独立的Cookie存储,请求www.example.com时,带上Domain=www.example.com的那个;请求blog.example.com时,带上Domain=blog.example.com的那个,如果这两个Cookie都指定了.example.com,浏览器只保留一个,后写入的覆盖先写入的。共享Cookie设计时统一用一个Cookie名,并固定Domain为根域名,就能避免冲突

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/621593.html

(0)
虚拟机无法关机如何解决,虚拟机强制关闭方法?
上一篇 2026年9月4日 07:24
配置中心自建还是接入托管服务要看哪些因素,如何选择更合适?
下一篇 2026年9月4日 07:28

相关推荐

  • 服务器平台费用贵吗?一般服务器平台收费标准是多少

    服务器平台费用是否昂贵,不能一概而论,其核心结论取决于业务规模、性能需求以及采购模式的匹配度,对于绝大多数中小企业而言,服务器平台费用并不算贵,且随着云计算技术的普及,成本门槛已大幅降低;但对于高性能计算、大规模数据处理或特定合规要求的场景,费用确实不菲,判断费用高低的标准,并非单纯看价格数字,而应看“性能价格……

    2026年4月4日
    7700
  • 个人存储怎么上云端?手机照片自动备份到云端

    个人存储上云端的核心逻辑是将本地数据通过加密通道同步至服务商的分布式服务器,实现多设备实时访问与异地容灾,推荐优先选择支持端到端加密且提供明确隐私政策的头部云存储平台,将照片、文档从手机相册和电脑硬盘搬到云端,早已不是极客的专属技能,而是现代数字生活的刚需,我们每天产生的数据量呈指数级增长,本地设备的物理存储空……

    2026年5月30日
    5900
  • 服务器同时访问量怎么计算,并发量多少算高?

    服务器同时访问量计算,核心是并发连接数和请求响应时间的动态平衡,通常用“QPS = 并发数 / 平均响应时间”这个公式做初步估算,但实际场景需要结合压测、带宽和业务模型来修正,理解服务器同时访问量到底在算什么很多人一听到“同时访问量”,第一反应是“同一秒有多少人点进来”,服务器处理的是并发连接,也就是同一时刻在……

    2026年7月25日
    2200
  • 新式网络服务器有哪些?,怎么选择性价比高的?

    新式网络服务器是以云计算、虚拟化、软件定义网络为核心,提供弹性伸缩、按需付费、高可用特性的计算服务,彻底改变了传统物理服务器的运维模式,什么是新式网络服务器传统服务器是一台固定配置的物理设备,需要提前采购、上架、配置网络,资源利用率低且扩展困难,新式网络服务器通过虚拟化技术将物理资源抽象为池,按需分配实例,用户……

    2026年8月22日
    400
  • 服务器怎么填写?服务器IP地址正确填写方法

    服务器填写配置的核心在于精准匹配IP地址、子网掩码、网关与DNS信息,并确保物理连接与逻辑设置的无缝协同,正确填写服务器信息不仅是网络连通的基础,更是保障业务系统稳定运行的前提,无论是搭建网站、部署应用还是配置企业内部文件服务,服务器参数配置的准确性直接决定了网络服务的可达性与访问速度,一旦关键参数填写错误,轻……

    2026年3月16日
    14100
  • 服务器硬盘最大支持多少T,服务器最大存储硬盘多少?

    单台物理服务器的最大原始存储容量已突破2PB(拍字节),而在企业级数据中心通过分布式存储架构,其理论容量上限可扩展至EB(艾字节)级别,这一数值并非固定不变,而是由单块硬盘的物理容量、服务器机箱的盘位密度以及存储接口技术共同决定的,对于绝大多数企业应用而言,理解这一上限的核心在于平衡存储密度、数据读写性能与数据……

    2026年2月16日
    18200
  • 服务器坏了怎么办,服务器故障如何快速修复

    面对服务器故障,首要任务是保持冷静并迅速执行标准化的应急响应流程,核心结论在于:优先保障业务连续性与数据安全,通过“快速诊断-隔离故障-恢复服务-根因复盘”的闭环逻辑,将停机时间降至最低, 无论是硬件损坏还是软件崩溃,遵循既定的SOP(标准作业程序)是解决问题的关键,针对服务器坏了怎么办这一难题,以下将从故障排……

    2026年2月17日
    27700
  • 为什么越来越多的人选择云端Python?主要优势有哪些?

    云端Python是目前最灵活的编程环境选择,它让你在浏览器中就能完成开发、测试和部署,无需本地安装任何依赖,尤其适合团队协作与跨设备工作场景,云端python和本地python哪个更适合你?选择云端还是本地Python环境,取决于你的具体使用场景,两者在灵活性、性能、成本和协作便利性上存在明显差异,云端pyth……

    2026年7月17日
    2800
  • 一个RPG服务器需要哪些插件,哪个最好用

    一个RPG服务器需要的插件覆盖经济系统、技能树、副本机制、领地保护以及玩家交互这几个维度,核心插件选型必须围绕这些核心功能展开,否则服务器很难留住玩家,核心插件分类经济与商店插件RPG服务器里虚拟经济是玩家交互的基础,几乎每个服都会先装Vault作为经济接口,再搭配EssentialsX提供基础指令,但真正让经……

    2026年8月6日
    1000
  • FTP默认服务器端口是多少?,FTP端口21怎么设置?

    FTP默认服务器端口是21,这个端口专门用于控制命令的传输,而数据传送则根据主动或被动模式分别使用20端口或随机高位端口,无论是搭建文件共享系统还是排查网络故障,21端口始终是FTP服务绕不开的基础,下面从端口定义、模式对比、修改方法到安全防护,逐一拆解你真正需要掌握的细节,ftp默认端口多少?21端口的前世今……

    2026年7月27日
    1700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注