提到SitePoint文章的答案并不完全完整。请参阅RFC 6265(公平地说,这个RFC是在发布这个问题后于2011年发布的,它取代了之前的2000年的RFC 2965和1997年的RFC 2109)。
第5节。4条第2款有这样一段话:
用户代理应该排序的cookie的列表按以下顺序:
注:并非所有的用户代理进行排序的cookie的列表顺序,但这 顺序反映在本文撰写常见的做法,而且, 历史上,已经有服务器的(错误地)取决于 这个命令。
也有在4.2.2节这个小宝石:
...服务器不应依靠系列化的顺序。特别是,如果Cookie标头包含两个具有相同名称(例如,具有不同路径或域属性的设置)的cookie,则服务器不应该依赖于这些cookie出现在标题中的顺序。
在您的示例请求的cookie(曲奇:A = 2; A = 1)注意,cookie中设置与路径/示例(A = 2)具有长于一个路径与路径/(a = 1),所以它会首先发送给您,符合规范的建议。因此,你或多或少正确的假设你可以选择的第一个值。
不幸的是RFC中所使用的语言是非常具体 - 使用的话SHOULD和不应该 RFC中引入歧义。这些表示约定应遵循,但不要求要求符合规范。尽管我很了解RFC,但我还没有做过研究,看看真实世界的客户端在做什么;可能有一个或多个浏览器或其他软件充当HTTP客户端,可能不会首先在Cookie中发送最长路径cookie(例如:/example),其中包括标头。
如果你是在一个位置来控制cookie的值,你想使你的解决方案万无一失,你最好把两种:
- 使用不同的cookie名在某些路径覆盖
,如:
- 的Set-Cookie:一个全局= 1;路径= /;版本= 1
- 的Set-Cookie:一个-示例= 2;路径= /例子;版本= 1
存储你在cookie值本身需要的路径:
- 的Set-Cookie:A = 1条&路径= /;路径= /;版本= 1
- 的Set-Cookie:A = 2 &路径= /例子;路径= /例子;版本= 1
这两种解决方法需要在服务器上额外的逻辑来挑选期望的Cookie值,由所请求的URL针对可用的饼干的列表进行比较。这不太漂亮。不幸的是,RFC没有先见之明要求更长的路径完全覆盖具有较短路径的cookie(例如:在您的示例中,您将收到Cookie:a = 2只有)。
我会尽我所能(阅读:我可以做的每件事)以避免重复的cookie名称。大多数人从未遇到过这个问题 - 理由很充分。 – 2010-10-29 22:27:16