后台一个域、前端一个域、预览又一个域,浏览器认不认它们是同一个站
本文目录
- 浏览器凭什么认定两个域名属于同一个站?
- 为什么不能靠数点号来切
- 这一条边界同时决定了多少件事
- 那份决定边界的清单,到底是个什么东西?
- 两个段落,两种性质
- 全世界只有8条例外规则
- PRIVATE段里,谁在认真对待这件事
- 同样是Headless CMS,为什么有的把客户隔开、有的没有?
- 按行业分档,差距大得离谱
- 三组把差异摆到明面上的对照
- 这里有个坑,我自己先掉进去了
- 我在真实浏览器里做了一次跨租户实验,结果如何?
- 实验怎么设计的
- A组值得单独说:它不止是“读得到”
- 平台自己在这条共享边界上放了什么?
- 五年有效期的跨租户标识
- 这就是它难改的原因
- 你浏览器里的那份清单,其实停在四个月前?
- 怎么测一份看不见的快照
- 分界线卡得异常干净
- 升级浏览器不等于更新清单
- 想让自己的域名进这份清单,要排多久?
- 门槛比想象中高
- 队列有多长
- 两段延迟是要叠加的
- 边界被改动的那一刻,会发生什么?
- 加进去:原本能跨的突然跨不了
- 移出来:原本隔开的突然并成一家
- 换成Headless这套架构,边界具体卡在哪几处?
- 八个具体的落点
- SEO这一侧也别漏
- 上线之前,怎么把这件事一次定死?
- 三条一分钟就能查完的
- 域名规划的两条原则
- 三件别做的事
- 常见问题解答
- 我用的托管平台不在清单里,是不是必须立刻换掉?
- 我自己的公司域名需要去申请加入PSL吗?
- 预览域和正式域不同站,除了重新登录还有别的后果吗?
- 怎么快速判断一个域名的eTLD+1到底是什么?
- 浏览器快照滞后4个月,这个数字会一直是4个月吗?
- 已经在共享边界上跑了一段时间,怎么收拾?
- 权威参考资料
摘要:浏览器判断两个域名算不算同一个站,靠的不是你的域名注册商,也不是DNS,而是一份放在代码托管平台上、由志愿者审合并请求的纯文本文件。这次把这份文件的10239条规则全量拆开数了一遍,又用真实浏览器实测了45个托管平台的边界判定。最刺眼的一组结果是:在某个知名博客平台的一个租户站上写下的Cookie,换到另一个毫不相干的租户站,16个请求原封不动把它带了过去。而更麻烦的一层在后面——你浏览器里装的那份清单,实测停在四个月前。
这事的起点是一次很普通的排查。
一个客户把内容后台迁到了Headless架构上,前端部署在托管平台的二级域下,内容后台在另一个平台的二级域下,中间还有一个给编辑用的预览环境。上线三周,编辑那边反复投诉:预览环境每天要重新登录好几次,而正式站的登录态好好的。开发查了会话超时、查了负载均衡的粘性、查了时钟偏移,一无所获。
最后定位到的原因,说穿了只有一句话:预览域所在的那个托管平台,浏览器不认为它的两个客户之间需要隔离,也不认为同一个客户的两个子域属于同一个站——因为这家平台压根没在那份清单上登记过。
清单的名字叫公共后缀列表,英文是Public Suffix List,圈子里习惯叫它PSL。它决定的东西比大多数人以为的多得多:Cookie能写到哪一层、跨站请求算不算跨站、缓存怎么分区、隐私隔离按什么单位切。上一篇拆SameSite在支付回跳时怎么把会话弄丢,讲的是跨过边界之后会发生什么;这一篇往上游走一层,讲边界本身是谁划的。
下面的数字全是这两天现拉现测的:PSL原文的全量统计、45个平台域的逐个核查、真实Chrome与Chromium双版本的跨租户实验,以及一次专门设计的快照比对。有两个结果和保哥事先的判断相反,其中一个直接推翻了原本准备写进去的建议。
浏览器凭什么认定两个域名属于同一个站?
先破一个直觉。多数人心里的默认答案是:域名一样就是一个站,域名不一样就是两个站。这个答案在shop.example.com和www.example.com身上碰巧是对的,换个场景立刻就错。
浏览器用的定义是另一套。Google在自家开发者文档里把它写得很直白:一个“站”由协议、有效顶级域,以及紧贴在有效顶级域左边的那一个标签共同构成,这个组合通常写作eTLD+1。
为什么不能靠数点号来切
有效顶级域这个词里的“有效”两个字,是全部麻烦的来源。
example.com的顶级域是com,切一刀就够。example.co.uk呢?如果照样只切最后一段,得到的是uk,那么a.co.uk和b.co.uk就成了同一个站的兄弟子域——这意味着任意一家英国公司都能给另一家写Cookie。显然不能这么算。
问题是,co.uk要当成一个整体、com不用,这件事没有任何算法能从域名字符串本身推出来。它是注册政策,不是语法。唯一的办法就是查表。而这张表,就是PSL。
这一条边界同时决定了多少件事
如果它只管Cookie,重要性还有限。实际情况是,现代浏览器把相当多的机制都挂在了同一个判定上:
| 机制 | 它拿这条边界干什么 |
|---|---|
| Cookie的Domain属性 | 决定你能不能把Cookie写到上一层,写到公共后缀上直接整条丢弃 |
| SameSite判定 | 决定一次请求算不算跨站,进而决定会话Cookie带不带 |
| 分区Cookie(CHIPS) | 分区键取自顶层页面所在的站,站的定义就是这条边界 |
| Fetch Metadata | Sec-Fetch-Site里的same-site与cross-site按它区分 |
| 浏览器隐私隔离 | 第三方存储、缓存分区大多以站为单位而不是以主机为单位 |
| 搜索控制台的资源类型 | 网域资源与网址前缀资源覆盖的子域范围不同,跟你对“一个站”的理解直接挂钩 |
换句话说,这不是一个冷门的规范细节,而是一个被复用了很多次的单点。一处判定,多处后果。它错了,错的不是一件事。
那份决定边界的清单,到底是个什么东西?
我把2026年7月28日这天的PSL原文完整拉了下来,逐行解析。全文332855字节、16410行,去掉注释和空行之后是10239条有效规则。
两个段落,两种性质
文件被两组标记切成了泾渭分明的两半:
| 段落 | 条数 | 谁往里写 | 典型内容 |
|---|---|---|---|
| ICANN段 | 6949 | 域名注册管理机构 | com、co.uk、com.cn、ne.jp |
| PRIVATE段 | 3290 | 各家公司自己申请 | github.io、vercel.app、myshopify.com |
ICANN段有个反直觉的地方:6949条里有5508条是带点的多段后缀,占79.3%,真正的单标签顶级域只有1441个。也就是说,那种“顶级域就是最后一段”的心智模型,对将近八成的条目都是错的。
全世界只有8条例外规则
PSL的语法一共三种:普通规则、以*.开头的通配规则、以!开头的例外规则。前两种数量可观——通配规则有281条(ICANN段16条、PRIVATE段265条)。例外规则则少得有点好笑:整份清单只有8条。
而且这8条的内容很有年代感:一条是!www.ck,剩下7条全是日本的市,川崎、北九州、神户、名古屋、札幌、仙台、横滨。这不是随手写的,是因为日本的地域型域名规则里,市一级默认被当作公共后缀,唯独这几个大城市自己要用,所以单独开了口子。一份被全球浏览器共同依赖的清单,其例外条款里躺着七座日本城市的名字,这大概是互联网基础设施最朴素的样子。
PRIVATE段里,谁在认真对待这件事
PRIVATE段的3290条规则来自602个提交块。分布极其不均:
| 提交方 | 登记条数 | 占PRIVATE段 |
|---|---|---|
| 亚马逊系(合并23个分块) | 844 | 25.7% |
| DynDNS.com | 279 | 8.5% |
| GMO Pepabo | 107 | 3.3% |
| No-IP.com | 85 | 2.6% |
| 其余576家合计 | 1975 | 60.0% |
一家云厂商占了整个PRIVATE段的四分之一,而304个提交块(占50.5%)只登记了一条规则。亚马逊那844条还不是一次交上去的,而是按产品线拆成23个块陆续提交的——对象存储一块、托管工作流一块、云端开发环境一块。顺带一提,全表最深的一条规则有7段:*.airflow.cn-north-1.on.amazonwebservices.com.cn,光看这一行就知道是谁写的。
还有个细节值得留意:能解析出邮箱的590条提交记录里,本地部分为security的有75个,加上其他安全职能前缀一共81个,占13.7%。提交人把它当安全边界在提交,而清单官方并不这么承诺。这个落差后面还会再出现。
同样是Headless CMS,为什么有的把客户隔开、有的没有?
知道了清单长什么样,接下来是最实际的问题:你正在用的那些平台,在不在里面?
我按官方匹配算法写了一个查询器,把45个常见的托管、建站、内容平台域逐个跑了一遍。判据很简单:如果一个租户站的eTLD+1等于平台自己的注册域,说明这个平台没登记,所有客户挤在同一个站里;如果eTLD+1是租户自己那一段,说明登记过了,客户各自独立。
这45个域覆盖的正是独立站建站时会摆上台面的那几类方案:托管型SaaS、自建、纯代码,以及近两年冒出来的一堆前端托管。选型清单上通常只比价格、生态和SEO表现,边界这一栏基本没人填。
按行业分档,差距大得离谱
| 档位 | 已登记 | 未登记 | 登记率 |
|---|---|---|---|
| 可视化建站工具 | 5 | 0 | 100% |
| 前端与静态托管 | 12 | 2 | 86% |
| WordPress托管 | 3 | 6 | 33% |
| Headless CMS | 2 | 9 | 18% |
| 电商SaaS | 1 | 5 | 17% |
45家里23家登记了、22家没有,总体几乎对半开。可一拆开就完全不是对半开的样子:最高的一档是100%,最低的一档是17%,中间几乎没有过渡地带。
我原本准备写进去的结论是“越靠近部署越在意、越靠近内容越不管”。这张表把它推翻了——可视化建站工具离部署远得很,却是唯一一个全员登记的档。
换个角度才通:真正的分界不是平台做什么业务,而是这家平台有没有把“客户之间互不信任”当成自己的风险。前端托管和建站工具的客户是一群素不相识的人,同一个域名底下的邻居随时可能是对手;Headless CMS和电商SaaS的默认心智则是“我的用户是编辑和店主,都是自己人”。
三组把差异摆到明面上的对照
光看比例还不够刺激,几组具体的对照更能说明问题。
第一组,同行不同命。Headless CMS这一档里,Strapi登记了strapiapp.com,而且连媒体子域media.strapiapp.com都单独登记了一条;Contentful登记了预览用的ctfcloud.net。而Sanity、Storyblok、Prismic、Hygraph、Directus、Payload、Ghost、Kontent.ai、TinaCMS——搜遍整份清单,一条都没有。同一个品类、同一批客户、完全相反的选择。
之前拆这三家在SEO上的六个维度差异时,比的是渲染模式、结构化数据、多语言这些看得见的东西。域名边界这一层,当时压根没进视野。
第二组,同一家公司的两个域。Shopify登记了myshopify.com,实测在真实商店页面上写domain=myshopify.com的Cookie会被浏览器拒绝,隔离是实打实的。但它的预览域shopifypreview.com不在清单里。正式域隔离,预览域不隔离,而预览链接恰恰是最容易被随手转发出去的那一类。
第三组,换了域名之后。WP Engine在清单里有两条,wpenginepowered.com和js.wpenginepowered.com,都是新域。旧域wpengine.com至今一条都没有。这说明他们知道该登记——只是登记的是新域,老客户还留在没登记的那一边。
最后一个对照最有画面感:两大托管博客平台,Google的blogspot.com在清单里,而wordpress.com一条都没有。同样是让千万人开博客的地方,一个划了边界,一个没划。
这里有个坑,我自己先掉进去了
第一版统计我是按关键词搜的,搜payload命中了一条payload.dev,于是把Payload这家CMS记成了“已登记”。回头核对提交方才发现,payload.dev是Figma提交的,跟那家CMS毫无关系。同名撞车让整档的登记率算高了一截。
教训是:判定一个平台在不在清单里,必须拿它实际分给客户的那个域去查,再回头看这条规则是谁提交的,两头都对上才算数。光搜品牌名,撞上重名就会得出反过来的结论。
我在真实浏览器里做了一次跨租户实验,结果如何?
上面全是查表推出来的。查表会不会和浏览器的实际行为对不上?这必须实测。
实验怎么设计的
用自动化控制两个浏览器:本机真实的Chrome 150,以及自动化套件自带的Chromium 148。全程无痕上下文,写入的探针叫d75probe,值固定为1,不含任何有意义的信息,每组跑完清空。判据是写入是否被浏览器接受,以及换一个租户站之后还读不读得到。
| 组 | 场景 | 动作 | 预期 | 实测 |
|---|---|---|---|---|
| A | 平台未登记 | 在租户站写domain=wordpress.com | 能写进去 | 写进去了 ✔ |
| A | 平台未登记 | 换到另一个租户站读 | 读得到 | 读到了 ✔ |
| B | 平台已登记 | 写domain=github.io | 被拒 | 被拒 ✔ |
| B | 平台已登记 | 写domain=aws.github.io | 能写进去 | 写进去了 ✔ |
| B | 平台已登记 | 换到另一个租户站读 | 读不到 | 读不到 ✔ |
| C | 顶级域对照 | 写domain=com | 被拒 | 被拒 ✔ |
| D | 电商平台对照 | 写domain=myshopify.com | 被拒 | 被拒 ✔ |
七项全中,Chrome 150与Chromium 148结果逐条一致。查表推导和浏览器实际行为完全对得上,说明这套判定不是纸面规范,是真在跑的代码。
A组值得单独说:它不止是“读得到”
A组的第一步很平淡:在一个租户站上写下带平台注册域的Cookie,浏览器接受了,Cookie罐里那条记录的域字段是.wordpress.com。
真正让我坐直的是第二步。导航到另一个完全不相干的租户站之后,我没有只看JS能不能读到,而是把这一次导航发出的全部请求的Cookie头都抓了下来。16个请求带着这条探针发了出去,其中1条是顶层文档请求。也就是说,这条Cookie不是躺在浏览器里能被读一读而已——浏览器主动把它送到了另一家租户的服务器上。
抓到的那条请求头长这样(截断处理):
Cookie: tk_ai=SqN%2F70%2FcHp3rLY%2F92R913HGz; tk_qs=; ccpa_applies=false;
usprivacy=1---; wordads_uid=d8o85roq1785246922893; d75probe=1探针在最后一位。但请注意它前面那几位。
平台自己在这条共享边界上放了什么?
上面那条请求头里,d75probe是我放的,其余几条不是。这就引出了一个更有意思的问题:既然这条边界是共享的,平台自己有没有在用它?
五年有效期的跨租户标识
我直接看了几个平台首页的响应头。dailypost.wordpress.com下发了6条Cookie,其中一条是这样的:
tk_ai=...; expires=Sun, 27 Jul 2031 13:47:47 GMT; Max-Age=157680000;
path=/; domain=.wordpress.com; secureMax-Age是157680000秒,折合整整5年。域属性写的是.wordpress.com,意味着它对每一个租户站都有效。另一家建站平台也是同样的路数,下发一条Domain=.squarespace.com、有效期到2027年的标识。
再回头看那条跨租户请求头里的wordads_uid,名字已经说明了用途。这条共享边界不是没人注意到的疏漏,它是平台产品设计里明明白白在用的一块地基。
这就是它难改的原因
到这一步,很容易冒出一句“那赶紧去申请登记啊”。但请把因果关系再理一遍:一旦这个域进了PSL,平台自己那套跨租户的标识、统计和广告归因,第二天就全断了。
所以这不是一个待办事项被忘了,而是一个平台有理由不去做的动作。你作为租户,等的是一个和你利益并不一致的决定。凡是“某个开关只能由别人来拨、而那个人拨了会亏”的场景,等是等不来的,只能绕。
你浏览器里的那份清单,其实停在四个月前?
写到这儿我本来准备收尾了。结果一个念头冒出来:浏览器里的PSL是从哪来的?
去翻了Chromium源码里对应目录的说明,第一句话就是关键——这个目录存放的是“Chromium对公共后缀列表的一份拷贝”。拷贝。不是实时查询,是随浏览器一起发布的快照。
怎么测一份看不见的快照
问题来了:怎么知道这份拷贝停在哪一天?
PSL没有暴露任何查询接口,浏览器也不会告诉你它内置的版本号。我用的办法是把域名伪造出来:用自动化工具的路由拦截,把所有请求都截下来返回一个空白页面,这样https://tenant-a.任意后缀/都能正常打开,而浏览器对这个页面的源判定、Cookie判定,全部按真实规则走。
接着对每个待测后缀执行同一个动作:在tenant-a.某后缀上写domain=某后缀。被拒说明浏览器认它是公共后缀,写进去说明不认。一个动作,直接读出浏览器内置快照里有没有这条规则。
分界线卡得异常干净
先拉了从2024年初到现在的9个PSL历史版本,算出每个时间窗新增了哪些规则,然后每窗抽5条去测:
| 规则进入PSL的时间窗 | Chrome 150认出 | Chromium 148认出 |
|---|---|---|
| 2024-01至2024-07 | 5/5 | 5/5 |
| 2024-07至2025-01 | 5/5 | 5/5 |
| 2025-01至2025-04 | 5/5 | 5/5 |
| 2025-04至2025-07 | 5/5 | 5/5 |
| 2025-07至2025-10 | 5/5 | 5/5 |
| 2025-10至2026-01 | 5/5 | 5/5 |
| 2026-01至2026-02 | 5/5 | 5/5 |
| 2026-02至2026-04 | 5/5 | 5/5 |
| 2026-04之后 | 0/15 | 0/15 |
另外还测了7条根本不在清单里的域名当阴性对照,两个浏览器都是0认出——说明这套测法不会造假阳性。
结论没有任何模糊地带:2026年4月1日之前进入PSL的规则,40条测40条全部生效;4月1日之后进入的,15条测15条全部无效。今天是7月28日,滞后至少4个月,期间已经合入清单的112条规则,在这两个浏览器里一条都还没开始工作。
升级浏览器不等于更新清单
最反直觉的一条在这里:Chrome 150是当前的稳定版,Chromium 148比它落后两个大版本,两者的PSL快照却完全一样。
这意味着“让用户升级浏览器”根本解决不了这个问题——版本号涨了,清单不一定跟着走。PSL官方的说明页里其实早就把风险写了出来,措辞相当不客气:有人拿PSL来判断一个域名是不是有效域名,“This is dangerous”;如果以静态方式集成、又不定期更新,软件就会把有效的顶级域判成无效,或者把已经退役的当成有效。
这段警告的主语是“集成PSL的软件”,而浏览器正是最大的那一个。
想让自己的域名进这份清单,要排多久?
假设你就是那家没登记的平台,现在决心补上,流程是什么样?
门槛比想象中高
官方指南要求先证明你确实控制这个域名,首选办法是加一条名为_psl的DNS文本记录,内容指向你那个合并请求的链接。还有一条容易被忽略的硬要求:提交的域名,注册到期日必须比提交日晚2年以上,注册期不足一年的可能被直接移除。
这两条其实相当合理——它筛掉的正是那些“用完就扔”的域名。
队列有多长
我去仓库现拉了数据。截至2026年7月28日:
| 指标 | 数值 |
|---|---|
| 待处理的合并请求 | 65个 |
| 等待天数中位数 | 37天 |
| 等待超过90天的 | 7个(10.8%) |
| 最久的一个已等 | 405天 |
| 已合并样本的中位耗时 | 7天 |
| 已合并样本的平均耗时 | 28.4天 |
| 历史上最慢的一次 | 554天 |
中位数7天看着挺客气,平均值28.4天暴露了长尾。队列里躺着的名字并不都是小公司——某云厂商2026年第二季度的批量提交排了168天,某知名营销平台的申请排了91天。
官方指南对此的表述非常坦率,原文是全大写的:“There are NO SERVICE LEVEL AGREEMENTS ON TIME”,没有任何时效承诺,也不要期待处理速度或紧急通道。这是一群志愿者在维护一份全球浏览器都在用的文件,这个反差本身就值得记一笔。
两段延迟是要叠加的
这里有个很容易算错的账。合并进清单不等于生效,合并之后还要等浏览器把新快照打包发布,而上一节实测出来的这一段是4个月。
两段加起来:中位37天的排队,加上4个月的快照滞后。今天决定要划这条边界,用户的浏览器真正开始执行它,保守估计要等半年。做技术方案的时候,把这半年算进去,比事后解释为什么“我们明明登记了”要省事得多。
边界被改动的那一刻,会发生什么?
清单不是只增不减的。把历史版本对比一遍就能看到它一直在两个方向上动:
| 时间范围 | 新增规则 | 删除规则 |
|---|---|---|
| 近一年(2025-07起) | 472 | 83 |
| 2026年以来 | 195 | 54 |
| 近四个月 | 112 | 29 |
加进去:原本能跨的突然跨不了
一个域被加进PSL,效果是立刻把它变成一堵墙。原先写在这一层上的Cookie,规范里说得很明确:如果清单的变化导致某条Cookie的域变成了公共后缀,那么这条Cookie就被视为无效。
请注意这句话的时态。它作用于已经存在的Cookie,不是只影响以后新写的。用户浏览器里躺着的登录态,可能在某天升级浏览器之后集体作废,而你的服务端日志上什么都看不到——只会看到一批老用户忽然都变成了新访客。
移出来:原本隔开的突然并成一家
反方向更危险,而且一年发生83次。一个域从清单里被删掉,意味着此前被隔离的租户,从某个浏览器版本起开始共用一个Cookie罐。
没有任何报错、没有任何告警、你的监控面板一片绿色。安全边界消失这件事,在被动一方那里是完全静默的。这也是为什么把PSL当成安全边界要格外谨慎——它是一个由第三方维护、可以在你不知情的情况下被移动的边界。
换成Headless这套架构,边界具体卡在哪几处?
回到开头那个客户的问题。Headless的部署形态天然是多域的,边界问题因此被放大了好几倍。保哥手上那个上线半年又回滚的案子复盘时列了三本账——成本、工序、团队,现在回头看,还漏了一本:域名边界这本账,当时压根没人记。
八个具体的落点
| 落点 | 边界没划好会怎样 |
|---|---|
| 预览环境登录态 | 预览域与正式域不同站,会话Cookie带不过去,编辑反复登录 |
| 内容后台与前端打通 | 单点登录跨不过去,只能退回各登各的 |
| API子域鉴权 | Cookie方案在跨站时失效,被迫改令牌,改造量不小 |
| 同租户串味 | 平台未登记时,别的客户能给你的预览域写Cookie |
| 跨域资源策略 | Sec-Fetch-Site的判定跟着变,同源策略与CORS配置得重算 |
| 搜索控制台资源 | 网域资源的覆盖范围与你以为的“一个站”不一致 |
| 预览域被索引 | 托管平台的默认域常被抓取,预生产环境泄漏进索引是老问题了 |
| 统计与同意管理 | 同意状态存在Cookie里,跨不过去就要重新弹窗,同意管理平台的选型要连边界一起考虑 |
SEO这一侧也别漏
技术侧之外,还有几件和搜索直接相关的。Headless上线时那套要自己重搭的SEO基建里,站点地图和重定向是明面上的活;域名边界是暗面上的活,它不报错,但会让你的规范网址判定指向一个你没打算对外的域。
还有一件容易搞混的事:SEO意义上的“子域还是子目录”,和浏览器意义上的“是不是同一个站”,是两套完全不相干的判定。前者讨论的是权重怎么传导,后者讨论的是Cookie能不能过去。同一个架构决策,两套评价体系,别拿一套的结论去回答另一套的问题。
上线之前,怎么把这件事一次定死?
最后落到可执行的部分。下面这套顺序,保哥现在给客户做架构评审时是照着走的。
三条一分钟就能查完的
- 把你正在用的每一个平台默认域抄下来,去清单里搜一遍。直接在PSL原文里搜字符串就行,几秒钟出结果。搜不到,就按“所有客户共用一个站”来设计。
- 在租户站的控制台里试着往平台注册域写一条Cookie。写进去了,说明边界不存在;被拒了,说明生效。这一步比查表更可信,因为它测的是用户那台浏览器的真实行为。
- 看一眼平台自己下发的Cookie的域属性。如果平台自己就在往共享域上写长期标识,那么这个边界短期内不会有变化。
域名规划的两条原则
第一条,凡是要带登录态的,全部收进你自己的注册域。前端www、接口api、预览preview、后台admin,都挂在自有域的子域上。这样一来边界是你自己划的,不依赖任何第三方的清单,也不用等半年。托管平台给的默认域只当部署产物,不当业务入口。这条和出海站选ccTLD、子目录还是子域名那套决策并不冲突——那边定的是内容怎么分,这边定的是会话怎么走,两件事分开定,再看有没有打架。
第二条,接受“跨站”是常态,别指望靠Cookie把它抹平。如果架构上确实必须跨站,那就从一开始按跨站设计:令牌走请求头、会话不依赖顶层域的Cookie、需要传状态的地方显式传。前端框架的渲染模式选择要和这条一起定,因为它决定了鉴权发生在服务端还是浏览器端。
三件别做的事
别把PSL当成一份可以实时查询的权威源。它是一份缓存,你面前每个用户手里那份的版本都不一样。任何“我查了PSL所以一定如何”的推理,都得先问一句:查的是谁那份?
别把它当安全边界的唯一凭据。它由志愿者维护、可被移除、你收不到通知。真正的隔离要靠你自己的鉴权,PSL最多算一层附赠的保险。
别在没测过的情况下相信任何解析库的结论。库里也是快照,而且往往比浏览器还旧。要判断真实行为,就去真实浏览器里写一条Cookie试试——这件事的成本是30秒。
常见问题解答
我用的托管平台不在清单里,是不是必须立刻换掉?
不必然。要看你在那个域上放了什么。如果它只承载静态展示、没有登录态、没有敏感Cookie,那么共用边界的实际影响很小。真正需要动的是两类:一类是在平台默认域上跑带登录的预览或后台,另一类是把用户的支付、账号相关流程放在了平台默认域上。这两类应该尽快迁到自有注册域的子域下。判断顺序是先看“这个域上有没有会话”,再决定要不要动,而不是一看到未登记就全盘重构。
我自己的公司域名需要去申请加入PSL吗?
绝大多数情况不需要,而且不该申请。PSL的PRIVATE段是给“把子域分发给互不信任的第三方”的平台准备的,比如托管商、动态DNS服务商、多租户SaaS。如果你的子域都是自己人在用,加进去反而会让你自己的跨子域Cookie直接失效,属于自伤。官方指南也明确表示,服务用户数达不到规模的项目大概率会被拒。判据很简单:你的子域会不会交给你不信任的人?不会,就别去排这个队。
预览域和正式域不同站,除了重新登录还有别的后果吗?
有,而且更隐蔽。同意管理平台的选择记录通常存在Cookie里,跨不过去就会在预览环境反复弹窗,编辑很容易顺手点掉,导致预览环境的统计口径和线上不一致。此外,如果预览环境要调用正式环境的接口,浏览器会把这次调用判成跨站,Sec-Fetch-Site的值随之改变,服务端如果做了基于这个头的校验就会开始拒绝。还有一层是缓存分区:不同站意味着不同的分区键,预览环境的资源缓存不会复用正式站的,首屏会明显慢一截。
怎么快速判断一个域名的eTLD+1到底是什么?
最省事也最可信的办法是在目标域的页面上打开控制台,试着往你猜测的那一层写Cookie,写得进去说明它不是公共后缀。查表当然也行,但要注意查的那份表和用户浏览器里的那份可能差着几个月。另外提醒一句,很多现成的域名解析工具用的是自带快照,判断新域名时容易出错,做批量根域名提取这类工作时,遇到近期新增的后缀要额外核对一遍。
浏览器快照滞后4个月,这个数字会一直是4个月吗?
不会,它是浮动的,而且没有公开的承诺周期。本文测的是2026年7月底的两个具体版本,测出来的分界线落在4月初。下次再测很可能是另一个数字。真正要记住的不是“4个月”这个值,而是这个延迟客观存在、量级是月而不是天,并且升级浏览器版本并不保证它会缩短。做方案时按季度量级留余量,比盯着某个具体数字更稳妥。
已经在共享边界上跑了一段时间,怎么收拾?
分三步。第一步止血:把新的登录态、支付态全部迁到自有注册域的子域,不要在共享域上再产生新的会话。第二步清理:给共享域上已经写出去的Cookie发一轮删除指令,也就是重发同名同属性、寿命为0的Cookie,这一步必须把域属性写得和当初完全一致,否则删不掉。第三步验证:用无痕窗口走一遍完整流程,确认新会话的Cookie域字段是你自己的域。整个过程不需要停机,但顺序不能反——先迁再清,反过来会把在线用户直接踢下线。
权威参考资料
本文标题:《后台一个域、前端一个域、预览又一个域,浏览器认不认它们是同一个站》
本文链接:https://zhangwenbao.com/public-suffix-list-site-boundary-cookie-subdomain.html
版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0