Cookie教程-path属性

880 阅读4分钟
HTTP Cookies
## path属性的含义

path是一个路径,代表只有当前访问URL的路径是path或其子路径时Cookie才可以被访问。 例如:path=/movie

pathdomain类似,都是用来隔离Cookie的。当path不同时即使Cookie名称相同,那也不会是同一个Cookie。 例如:同一个网站中,t=abcd; path=/moviet=abcd; path=/food,这两个叫t的Cookie是不同的Cookie。

path属性名大小写不敏感,任何字母大写或者小写都可以。 例如:path=/moviepAth=/movie都是可以的。

path的值大小写是敏感的,因此在设置或者访问Cookie时一定要注意path属性值的大小写。 例如:t=abcd; path=/Moviet=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路径的文件夹部分。 举例如下:

环境URLCookie的默认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中。

总结

pathdomain共同限定了Cookie的作用范围,我们每次设置Cookie时,这两个值如果被忽视往往会带来意想不到的bug。

当我们要修改或者删除一个Cookie时,也一定要记住必须指定和目标Cookie相同的pathdomain