在我撰写此答案时,accepted answer to this question 似乎表明,当接收到 Expires 值已过去的替换 cookie 时,浏览器不需要删除 cookie。这种说法是错误的。将 Expires 设置为过去是删除 cookie 的标准、符合规范的方式,规范要求用户代理尊重它。
过去使用Expires 属性删除cookie 是正确的,并且是规范规定的删除cookie 的方法。 RFC 6255 的示例部分指出:
最后,为了移除一个cookie,服务器返回一个Set-Cookie header
过期日期在过去。服务器会成功
仅当 Path 和 Domain 属性在
Set-Cookie 标头匹配 cookie 时使用的值
已创建。
用户代理要求部分包括以下要求,如果用户代理收到一个同名的新 cookie,其到期日期在过去
-
如果 [当接收到新 cookie 时] cookie 存储包含与新创建的 cookie 具有相同名称、域和路径的 cookie:
- ...
- ...
- 更新新创建的 cookie 的创建时间以匹配旧 cookie 的创建时间。
- 从 cookie 存储中删除旧 cookie。
-
将新创建的 cookie 插入 cookie 存储区。
如果 cookie 的过期日期已过,则该 cookie 已“过期”。
用户代理必须从 cookie 存储中清除所有过期的 cookie
如果在任何时候,cookie 存储中存在过期的 cookie。
以上第 11-3、11-4 和 12 点共同表示,当接收到具有相同名称、域和路径的新 cookie 时,必须删除旧 cookie 并用新 cookie 替换。最后,关于过期 cookie 的以下要点进一步表明,在完成之后,new cookie 必须也立即被驱逐。在这一点上,该规范没有为浏览器提供任何回旋余地。如果浏览器向用户提供禁用 cookie 过期的选项,正如公认的答案所暗示的某些浏览器所做的那样,那么它将违反规范。 (这样的功能也没什么用,据我所知,它在任何浏览器中都不存在。)
那么,为什么这个问题的 OP 观察到这种方法失败了?虽然我没有清理 Internet Explorer 的副本来检查其行为,但我怀疑这是因为 OP 的 Expires 值格式错误!他们使用了这个值:
expires=Thu, Jan 01 1970 00:00:00 UTC;
但是,这在两种情况下在语法上是无效的。
规范的syntax section 规定Expires 属性的值必须是a
rfc1123-date,定义在[RFC2616], Section 3.3.1
按照上面的第二个链接,我们发现这是作为格式示例给出的:
Sun, 06 Nov 1994 08:49:37 GMT
并找到语法定义...
- 要求日期以日月年格式书写,而不是提问者使用的月日年格式。
具体来说,它定义rfc1123-date如下:
```
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
```
并像这样定义date1:
```
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
```
和
- 不允许
UTC 作为时区。
规范包含以下关于此格式可接受的时区偏移量的声明:
所有 HTTP 日期/时间戳必须以格林威治标准时间 (GMT) 表示,无一例外。
更重要的是,如果我们深入研究这种日期时间格式的原始规范,我们会发现在 https://www.rfc-editor.org/rfc/rfc822 的初始规范中,Syntax section 将“UT”(意思是“通用时间”)列为可能的值,但 not 是否将 UTC(协调世界时)列为有效。据我所知,在这种日期格式中使用“UTC”从来没有有效;在 1982 年首次指定格式时,它不是一个有效值,并且 HTTP 规范通过禁止使用除 "格林威治标准时间”。
如果这里的提问者使用了Expires 属性,例如this,那么:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
那么它可能会起作用。