跳到正文
效率工具实用笔记关于本站
浏览器工具

Cookie的Domain和Path决定发给谁:作用域怎么读

约 7 分钟阅读AI 辅助整理

Cookie的Domain决定哪些主机能收到它,Path决定哪些路径能收到它。不写Domain只发给当前主机,写了则包含子域;Path按路径分隔符匹配子路径,但不会匹配同前缀的其他路径。

本文要点

  1. Domain这一项,关键差别在于有没有设置它

  2. Path这一项,决定请求URL里必须存在哪段路径,才会带上Cookie

  3. 上一节说子路径会被匹配,容易让人以为“只要路径开头是/docs就行”

Cookie的Domain和Path决定发给谁:作用域怎么读的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

先分清:Domain管主机,Path管路径

如果你在开发者工具里看到一条Cookie,想知道它会被发到哪些请求上,看两个属性就够了:Domain和Path。

按MDN的说明,Domain和Path标识定义了Cookie的作用域,也就是允许Cookie发送给哪些URL。Domain指定哪些主机可以接受Cookie;Path指定请求URL里必须存在哪段路径,才会发送Cookie。

一个自建示例(不是对某个真实网站的记录):假设你在练习目录里用本地服务打开一个页面,服务器返回一条Cookie,属性写成Domain=example.test、Path=/docs。那么这条Cookie只会发给example.test及其子域下、路径以/docs开头的请求。

适用范围:本文只讲Domain和Path如何限定Cookie发送到哪些主机和路径,以及子域、子路径的匹配规则。不讲SameSite和Secure属性,也不涉及登录状态管理。

读作用域时,先问两个问题:这条Cookie允许发给哪些主机?允许发给哪些路径?两个问题的答案分别来自Domain和Path。

Domain不写和写了,覆盖的主机范围不一样

Domain这一项,关键差别在于有没有设置它。

按MDN的说明,如果不指定Domain属性,它默认为同一host设置cookie,不包含子域名。如果指定了Domain,则一般包含子域名。文档还指出,指定Domain比省略它的限制要少。

用自建示例说明(不是对某个真实网站的记录):

- 不写Domain:在www.example.test上设置的Cookie,只发给www.example.test,不发给blog.example.test。

- 写Domain=example.test:这条Cookie也包含在子域名中,比如developer.example.test、blog.example.test都能收到。

所以“限制要少”的意思是:写了Domain,能收到Cookie的主机变多了。当子域需要共享信息时,这可能有用;但如果不打算让子域共享,写Domain就等于放宽了范围。

一个容易读错的地方:Domain写的是哪个值,就决定了从哪一级开始包含子域。写Domain=example.test,覆盖的是example.test及其子域;写Domain=www.example.test,覆盖范围就落在www这一层。

Path按路径分隔符匹配,子路径会被包含

Path这一项,决定请求URL里必须存在哪段路径,才会带上Cookie。

按MDN的说明,Path属性指定一个URL路径,该路径必须存在于请求的URL中,以便发送Cookie标头。它以字符%x2F(也就是“/”)作为路径分隔符,并且子路径也会被匹配。

文档给出的例子是:设置Path=/docs,以下地址都会匹配:

- /docs

- /docs/

- /docs/Web/

- /docs/Web/HTTP

也就是说,只要请求路径从/docs这一段开始,后面接什么子路径都算匹配。

这里要抓住“路径分隔符”这个说法。匹配是按一段一段的路径来比的,不是按字符前缀来比的。这一点决定了下一节的排除情况。

为什么/docsets和/fr/docs收不到

上一节说子路径会被匹配,容易让人以为“只要路径开头是/docs就行”。MDN的同一段例子给出了反例:设置Path=/docs时,以下请求路径不会匹配:

- /

- /docsets

- /fr/docs

把这三个反例分开看,能读出匹配规则的两个边界。

第一,/docsets不匹配。它的开头字符确实是/docs,但/docs后面接的是ets,没有路径分隔符“/”。这说明匹配是按路径段来的,不是按字符前缀来的。

第二,/fr/docs不匹配。这段路径里确实出现了/docs,但它不在开头,前面还有/fr这一段。Path要求的是这段路径存在于请求URL中,并且从路径开头算起。

第三,/不匹配,因为它连/docs这一段都没有。

所以读Path时,不要用“字符串开头是不是这几个字符”来判断,而要看请求路径从开头起,是不是以Path指定的那一段路径开始。

用一张自建对照表核对一条Cookie发给谁

把Domain和Path放在一起,就能回答“这条Cookie发给谁”。下面是一张自建对照表(示例,不是对某个真实网站的记录),假设Cookie设置为Domain=example.test、Path=/docs:

| 请求主机 | 请求路径 | 是否发送 | 原因 |

| --- | --- | --- | --- |

| example.test | /docs | 发送 | 主机匹配,路径匹配 |

| blog.example.test | /docs/Web/ | 发送 | 子域匹配,子路径匹配 |

| example.test | /docsets | 不发送 | 路径段不匹配 |

| example.test | /fr/docs | 不发送 | 路径不在开头 |

| other.test | /docs | 不发送 | 主机不匹配 |

核对顺序建议这样走:

1. 先看请求主机。它是不是Domain指定的主机,或者它的子域?不是,就不发送。

2. 再看请求路径。它从开头起,是不是以Path指定的那一段路径开始?不是,就不发送。

3. 两项都过,才发送。

这张表只用来核对Domain和Path两项,不涉及其他Cookie属性。

读作用域时的三个常见误判

第一个误判:把“不写Domain”当成“发给所有子域”。按MDN的说明,不指定Domain时默认为同一host设置cookie,不包含子域名。所以不写Domain,范围反而更窄,不是更宽。

第二个误判:把Path当成字符前缀。前面已经看到,Path=/docs不匹配/docsets。判断依据是路径段和路径分隔符,不是开头几个字符。

第三个误判:以为Path写了就一定从根开始。Path指定的是请求URL里必须存在的那段路径,它从路径开头算起。如果Path写成/docs,那么/fr/docs这种前面还有别的路径段的地址就不匹配。

这三个误判的共同点是:把“范围”想得比实际更宽。读一条Cookie的作用域时,宁可先按窄的范围理解,再逐项确认主机和路径是否真的匹配。

本文只讲Domain和Path两项的匹配规则。SameSite和Secure如何影响发送,不在本文范围内。

观看知识要点视频 18 秒

18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回浏览器工具 →