HTTP中的多个Set-cookie标头

时间:2010-09-27 17:13:57

标签: http browser http-headers

我正在编写一个充当非常基本的HTTP客户端的小类。作为我正在进行的项目的一部分,我正在让它识别cookie。但是,我不清楚当我的客户端收到多个具有相同密钥但设置了不同值的“Set-Cookie”标头时会发生什么。

例如,

Set-Cookie: PHPSESSID=abc; path=/
Set-Cookie: PHPSESSID=def; path=/
Set-Cookie: PHPSESSID=ghi; path=/

其中哪一项应该是PHPSESSID的价值?当您在同一页面上调用session_start()然后调用session_regenerate_id()时,通常会发生这种情况。每个都会设置自己的标题。所有的浏览器似乎都没问题,但我似乎无法让我的客户选择合适的浏览器。

有什么想法吗?!

3 个答案:

答案 0 :(得分:25)

RFC 6265 section 4.1.2州:

  

如果用户代理收到具有相同cookie名称的新cookie,则   域值和路径值作为已存储的cookie,
  现有的cookie被驱逐并替换为新的cookie   请注意,服务器可以通过发送用户代理来删除cookie   带有Expires属性的新cookie,其中包含过去的值。

所以我会按顺序处理标题,如果有重复则覆盖它们。所以在你的情况下你只有一个PHPSESSID = ghi。

答案 1 :(得分:17)

RFC 6265州:

  

服务器不应在具有相同cookie名称的同一响应中包含多个Set-Cookie头字段。

因此,如果您的服务使用相同的密钥发送多个Set-Cookie标头,我会非常担心。特别是因为我看到用户代理和代理行为异常 - 有时会取第一个标题的值,有时会重新排列标题。

作为客户端,典型的用户代理行为似乎是采用最后一个标头的值。 RFC通过以下声明暗示了这种行为:

  

如果用户代理收到的cookie具有与其已存储的cookie相同的cookie-name,domain-value和path-value,则现有cookie将被驱逐并替换为新cookie。

答案 2 :(得分:2)

答案应该在draft-ietf-httpstate-cookie