在我撰写此答案时,该问题的可接受答案似乎表明,浏览器在收到其Expires
值在过去的替换cookie时,不需要删除cookie 。该说法是错误的。设置Expires
为过去是删除Cookie的标准且符合规范的方式,规范要求用户代理遵守该规范。
Expires
过去使用属性删除Cookie是正确的,并且是删除规范规定的Cookie的方法。RFC 6255的示例部分指出:
最后,要删除cookie,服务器将返回一个Set-Cookie标头,其中包含过去的到期日期。仅当Set-Cookie标头中的Path和Domain属性与创建cookie时使用的值匹配时,服务器才能成功删除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的以下几点进一步表明,完成此操作后,还必须立即将新 cookie 逐出。在这一点上,规范没有为浏览器提供回旋余地。如果浏览器向用户提供禁用cookie过期的选项(如已接受的答案表明某些浏览器会这样做),则将违反规范。(这种功能也几乎没有用,据我所知它在任何浏览器中都不存在。)
那么,为什么这个问题的OP观察到这种方法失败了?尽管我尚未清除Internet Explorer的副本来检查其行为,但我怀疑这是因为OP的Expires
值格式不正确!他们使用了这个值:
expires=Thu, Jan 01 1970 00:00:00 UTC;
但是,从两种角度来看,这在语法上是无效的。
规范的语法部分规定该Expires
属性的值必须为
rfc1123 -date,在[RFC2616]第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://tools.ietf.org/html/rfc822的初始规范中,“ 语法”部分列出了“ UT”(表示“通用时间” )作为一个可能的值,但确实不是列表不UTC(世界协调时间)为有效。据我所知,以这种日期格式使用“ UTC” 从未有效。这不是一个有效的值时,在1982年第一次指定的格式,和HTTP规范已经通过严格更通过禁止使用除“GMT”以外的所有“区”值的格式的限制版本。
如果这里的问题提问者已经代替了Expires
属性,像这样的话:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
那么大概就可以了。