例如说我有一个应用程序发送以下HTTP标头设置为名为“一个” cookie:
Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1
如果我访问/example
在服务器上的两个路径是有效的,所以我有一个名为“”两个饼干! 由于浏览器不发送任何路径信息,两个cookie无法区分。
Cookie: a=2; a=1
应该如何这种情况下,如何处理? 挑选的第一个? 创建所有cookie值列表? 还是应该这样的情况下,被认为是开发人员的错误呢?
从这篇文章SitePoint :
如果具有相同名称的多个cookie匹配给定的请求URI中,一个由浏览器选择的。
更具体的路径,更高的优先级。 基于其它属性,包括域然而优先级,是不确定的,并且可以浏览器之间变化。 这意味着,如果你已经设置的同名饼干反对“.example.org”和“www.example.org”,你无法知道哪一个将被送回。
编辑:从2010年这个信息似乎已经过时,似乎浏览器可以在现在的回报低于@Nate详细信息发送多个cookie,看答案
提到关于SitePoint文章的答案还没有完全完成。 请参见RFC 6265 (说句公道话,这RFC于2011年发布后,这个问题被张贴,它取代了以前的RFC 2965 ,从2000年和RFC 2109 1997)。
第5.4条第2款有这样一段话:
用户代理应该排序的cookie的列表顺序如下:
注:并非所有的用户代理顺序排序cookie的列表,但这个顺序反映在本文撰写常见的做法,并在历史上,已经有服务器的(错误地)取决于此订单上。
还有一个在一节这个小宝石4.2.2 :
...服务器不应依靠系列化的顺序。 特别是,如果cookie头包含两个cookie具有相同的名称(例如,分别设置不同的路径或域的属性),服务器不应该依赖于这些饼干出现在头中的顺序。
在您的示例请求的cookie( 曲奇:A = 2; A = 1)注意,与路径/示例 (α= 2)设置cookie具有比所述一个与所述路径/(A = 1)更长的路径,所以它排在第一位,这符合该规范的建议被送回给你。 因此,你在你的设想或多或少正确的,你可以选择的第一个值。
不幸的是RFC中所使用的语言是非常具体-使用的话应该和不应该在RFC中引入歧义。 这表明, 应该遵循,但不要求都符合标准,以规范公约。 虽然我知道这样做的RFC相当不错,我没有做过研究,看看什么是真正的世界的客户做; 这是可能的一个或多个浏览器或作为HTTP客户端其他软件可以不发送的最长路径的Cookie:在Cookie第一(例如/实例 ):头。
如果你是在一个位置来控制cookie的值,你想使你的解决方案万无一失,你最好身上之一:
使用不同的cookie的名称在某些路径,如重写:
- 的Set-Cookie:一个全局= 1;路径= /;版本= 1
- 的Set-Cookie:一个-示例= 2;路径= /例子;版本= 1
存储您的cookie值本身需要的路径:
- 的Set-Cookie:A = 1&路径= /;路径= /;版本= 1
- 的Set-Cookie:A = 2&路径= /例子;路径= /例子;版本= 1
这两种解决方法都需要在服务器上的额外的逻辑来挑选所需的cookie值,由请求的URL对现有的cookie的列表进行比较。 这不是太漂亮。 这是不幸的RFC没有先见之明,需要一个较长的路径完全覆盖有一个较短的路径一个cookie(例如:在你的榜样,您将收到的Cookie:A = 2 只 )。
我当然知道它做广泛使用多个会话ID应用程序 - 似乎工作始终。 但是我不知道 - 查不到的打算 - 如果他们这样做,因为浏览器的依赖,当他们被设置返回一个一致的顺序饼干/他们设置还是哪条路径的应用程序尝试匹配每个一个现有会话。
我强烈建议,这种做法是可以避免的。
但是,如果你真的想知道的浏览器(和应用程序)如何处理这种情况下,为什么不建立一个试验台,并尝试一下。
有没有错有对多个同名值...如果你想他们。 你甚至可以嵌入在附加价值方面。
如果不这样做,那么当然,如果你想两种情况下不同的名字是一个解决方案。
另一种方法是从甚至更具体的路径发送具有相同路径(和域)相同的cookie的名称。 这些设置cookie的指令将覆盖cookie的值。
现在你知道最重要的部分(它们是如何工作),而且你可以完成你在几个不同的方式需要什么,我的回答你的问题是:这是一个开发人员的问题。