path是一个路径,代表只有当前访问URL的路径是path或其子路径时Cookie才可以被访问。
例如:path=/movie。
path和domain类似,都是用来隔离Cookie的。当path不同时即使Cookie名称相同,那也不会是同一个Cookie。
例如:同一个网站中,t=abcd; path=/movie和t=abcd; path=/food,这两个叫t的Cookie是不同的Cookie。
path属性名大小写不敏感,任何字母大写或者小写都可以。
例如:path=/movie和pAth=/movie都是可以的。
path的值大小写是敏感的,因此在设置或者访问Cookie时一定要注意path属性值的大小写。
例如:t=abcd; path=/Movie和t=abcd; path=/movie它们是两个完全不同的Cookie。另外如果当前URL是/movie,那t=abcd; path=/Movie也可以设置成功,只是需要当URL是/Movie或者/时才可以访问。
名词解释
先解释一下本篇文章使用的名词:
- URL路径
除去协议、域名、端口后剩下的部分。例如:
https://www.itthink.tech/abc/xyz/a.html,路径部分是/abc/xyz/a.html。这里我们把a.html也算作路径的一部分。 - 当前访问的URL 在Javascript环境中代表浏览器地址栏访问的URL,在Http环境中代表当前Http的URL。
- 环境路径 当前访问URL的路径
- 环境路径和
path匹配 环境路径和path相同或者是其子路径,则认为环境路径和path匹配
举例说明如下:
| 环境路径 | Cookie Path | 是否可访问 | 原因| |
|---|---|---|---|
| itthink.tech/abc/xyz | /abc | 是 | 子环境路径可以访问父路径下的Cookie |
| itthink.tech/abc | /abc/xyz | 否 | 父环境路径不可以访问子路径下的Cookie |
path的弱隔离性
和domain不同的是,只要Cookie的其他属性都符合要求,即使URL环境和path不匹配,Cookie还是会被保存下来,当后续有匹配的请求时,该Cookie会变成可访问状态。而domain属性,如果环境域名不符合domain的要求,那这个Cookie是不可能被保存下来的。
举例:
当前URL为:www.itthink.tech/abc/xyz
Cookie设置为:token=aaa; path=/uvw
URL的路径/abc/xyz和Cookie设置的路径/uvw完全不同,但是Cookie仍然会被保存,虽然在当前路径下不会生效,但是当访问/uvw路径时,该Cookie便会生效。
之所以说path是弱隔离的,是因为,我们虽然不可以读取其他路径下的Cookie,但是可以设置修改。不同业务之间如果通过path来隔离Cookie,很容易导致相互污染。
在大部分情况下,设置path=/就好,这样网站下的所有路径都可以共享该Cookie。另外如果设置成具体路径,例如path=/movie,那当用户在URL中输入了/Movie,由于path的值是大小写敏感的,所以此时用户浏览器发请求时将不能正常的获取到Cookie,从而可能导致不达预期。
path的默认值
设置Cookie时如果不设置path,将会使用默认值,默认值是当前环境URL路径的文件夹部分。
举例如下:
| 环境URL | Cookie的默认path | 注释 |
|---|---|---|
| www.itthink.tech/xyz/uvw | /xyz | 一般认为/xyz是文件夹,uvw是资源名 |
| www.itthink.tech/xyz | / | 无 |
| www.itthink.tech/xyz/ | /xyz | 这种情况需要注意,最后的那个/会被当作有效的文件夹层级,所以由于最后有一个/,所以文件夹部分是/xyz |
path的格式要求
- 第一个字符必须是
/如果不是/,目前所有主流浏览器的做法是将path使用其默认值代替。 - 必须确保在URL路径允许的字符范围内
由于
path要匹配的是一个URL的路径,所以URL不允许的字符放到path中是没有意义的。需要使用encodeURIComponent之类的函数对路径的每个部分进行编码处理,再放入到path中。
总结
path和domain共同限定了Cookie的作用范围,我们每次设置Cookie时,这两个值如果被忽视往往会带来意想不到的bug。
当我们要修改或者删除一个Cookie时,也一定要记住必须指定和目标Cookie相同的path和domain。