HTTP中的多个Set-cookie头

41

我正在编写一个作为基本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() 时,通常会出现这种情况。每个函数将设置自己的标头。所有浏览器似乎都能正常处理,但我似乎无法让我的客户端选择正确的值。

有什么想法吗?!

2个回答

35

RFC 6265第4.1.2节指出:

如果用户代理收到一个与已经存储的 cookie 具有相同的 cookie 名称、域值和路径值的新 cookie,那么现有的 cookie 将被删除并替换为新 cookie。
请注意,服务器可以通过发送带有过去时间戳的 Expires 属性的新 cookie 来删除 cookie。

因此,按给定顺序处理标头并在出现重复时覆盖它们。 因此,在您的情况下,只会有一个 PHPSESSID=ghi。


28

RFC 6265规定:

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

因此,如果您的服务发送了具有相同键的多个Set-Cookie头,则我会非常担心。特别是因为我曾经看到过用户代理和代理产生意外行为 - 有时获取第一个头的值,有时重新排列头。

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

如果用户代理接收到与其已经存储的cookie具有相同的cookie名称,domain-value和path-value的新cookie,则现有cookie将被清除并替换为新cookie。


3
它并不是说不能发送多个set-cookie头。它是说多个具有相同cookie名称的头部。 - Blaze
修复,以防原帖的上下文不够清楚。 - Brad Koch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接