指向SitePoint上一篇文章的答案并不完整。请参阅RFC 6265(为公平起见,此问题发布后,该RFC于2011年发布,它取代了2000年的RFC 2965和1997年的RFC 2109)。
第5.4节第2小节说:
用户代理应按以下顺序对Cookie列表进行排序:
- 路径较长的Cookie会在路径较短的Cookie之前列出。
注意:并非所有用户代理都按此顺序对cookie列表进行排序,但是此顺序反映了编写本文档时的惯例,并且从历史上看,有(错误地)依赖此顺序的服务器。
在4.2.2节中也有这个小宝石:
...服务器不应该依赖序列化顺序。特别是,如果Cookie标头包含两个具有相同名称的Cookie(例如,使用不同的Path或Domain属性设置的Cookie),则服务器不应依赖于这些Cookie在标头中出现的顺序。
在您的示例请求cookie(Cookie:a = 2; a = 1)中,请注意,设置为/ example(a = 2)的cookie的路径比设置为/(a = 1)的cookie的路径更长,因此它会首先按照规范的要求发送回给您。因此,您可以选择第一个值的假设或多或少是正确的。
不幸的是,RFC中使用的语言是非常特定的-使用单词应该和不应在RFC中引入歧义。这些指示应遵循的约定,但并非必须符合规范。尽管我对RFC非常了解,但我还没有进行研究来了解实际客户的工作。可能有一个或多个充当HTTP客户端的浏览器或其他软件可能未先在Cookie:标头中发送最长路径cookie(例如:/ example)。
如果您可以控制cookie的值并且希望使解决方案变得万无一失,则最好采用以下两种方法:
使用不同的Cookie名称覆盖某些路径,例如:
- 设置cookie:a-global = 1; Path = /; Version = 1
- 设置cookie:a-example = 2; Path = / example; Version = 1
将所需的路径存储在cookie值本身中:
- 设置cookie:a = 1&path = /; Path = /; Version = 1
- 设置cookie:a = 2&path = / example; Path = / example; Version = 1
通过将请求的URL与可用cookie列表进行比较,这两种解决方法都需要服务器上的其他逻辑来选择所需的cookie值。不太漂亮 不幸的是,RFC没有先见之明,要求较长的路径完全覆盖具有较短路径的cookie(例如:在您的示例中,您将收到Cookie: 仅a = 2)。