【发布时间】:2015-07-08 02:00:42
【问题描述】:
我刚刚使用 Internet Explorer 11 启动了一个虚拟机来测试这一点。尝试在 Internet Explorer 中运行以下 php:
<?php
setcookie('mycookie', rand(), 0);
setcookie('mycookie', rand(), time() + 60);
setcookie('sessioncookie', rand());
setcookie('expirecookie', rand(), time() + 60);
- 使用检查器检查生成的响应 cookie。
- 刷新页面。在上一个请求中收到的 Cookie 应在下一个请求中发送。
- Internet Explorer 未能保留“mycookie”cookie 的任何记录。其他两个设置好。这似乎只发生在您设置会话 cookie,然后设置具有过期和相同名称的 cookie 时。
我似乎无法在任何其他浏览器中重现此内容。这是 HTTP 规范中的内容,但 Chrome 和 Firefox 对此很宽容?
以下是 cookie 的响应标头:
Set-Cookie: mycookie=101636679
Set-Cookie: mycookie=158533464; expires=Tue, 07-Jul-2015 17:39:03 GMT; Max-Age=10
Set-Cookie: sessioncookie=1777324234
Set-Cookie: expirecookie=1229727377; expires=Tue, 07-Jul-2015 17:39:03 GMT; Max-Age=10
请注意,如果您颠倒前两个 setcookie 指令的顺序,一切都会按预期进行:
<?php
setcookie('mycookie', rand(), time() + 60);
setcookie('mycookie', 'latest', 0);
setcookie('sessioncookie', rand());
setcookie('expirecookie', rand(), time() + 60);
这会将“mycookie”值设置为“最新”。
【问题讨论】:
-
setcookie() 基本上只是在内部进行
header()调用。如果您尝试多次设置相同的 cookie,我不确定它是否在进行标头替换。如果没有,它实际上可能会发送多个 cookie 头,并且 IE 出于某种原因只尊重第一个遇到的,恰好是0time delete cookie。 -
当我检查响应时,两个标头都已设置。因此,“mycookie”有两个单独的 Set-Cookie 标头。如果确实是 IE 只尊重第一个 Set-Cookie 标头,则 cookie 应保留为会话 cookie。在 PHP 中将过期设置为 0 根本不会发送过期。我会用标题修改我的问题。我不确定为什么 IE 会完全丢弃 cookie,而不是至少在会话中保留它。
标签: php internet-explorer http cookies http-headers