我正在编写一个充当非常基本的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()时,通常会发生这种情况。每个都会设置自己的标题。所有的浏览器似乎都没问题,但我似乎无法让我的客户选择合适的浏览器。
有什么想法吗?!
答案 0 :(得分:25)
如果用户代理收到具有相同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)