Cookie 在 IE 中无法续订/覆盖

Cookie not renewing/overwriting in IE

提问人:deceze 提问时间:4/5/2010 最后编辑:deceze 更新时间:5/12/2014 访问量:9109

问:

我对 IE 中的 cookie 有一个奇怪的怪癖。当用户登录站点时,我正在生成一个新的会话 ID,因此需要覆盖 cookie。流程基本上是:

  1. 客户端进入页面,自动接收会话 IDhttps://secure.example.com/users/login
  2. 客户端 POST 将凭据登录到同一地址
  3. 客户端收到以下 set-cookie 标头以及 302 重定向到:https://secure.example.com/users/mypage

    CAKEPHP=已删除;expires=Sun, 05-Apr-2009 04:50:35 GMT;路径=/
    CAKEPHP=98hnIO23...;expires=Mon, 12 Apr 2010 04:50:36 GMT;路径=/;安全

  4. 客户端应该访问,显示新的会话 ID。https://secure.example.com/users/mypage

这适用于所有浏览器,除了IE(在7和8中测试)。IE 将保留旧的、未经身份验证的会话 ID,并重定向回登录页面。它适用于我的本地测试环境(使用自签名证书),但不适用于实时服务器。https://localhost:8443/...

我正在使用 CakePHP 并简单地发出一个 ,它会产生上述 cookie 头。$this->Session->renew()

任何想法如何让IE接受新的cookie?


以下是完整的标题:

HTTP/1.0 302 Moved Temporarily
Date: Thu, 08 Apr 2010 02:54:30 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT
Location: https://secure.example.com/users/mypage
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8

我想我已经找到了问题所在: IE 正在发送两个同名的 Cookie。下面是对服务器的下一个请求:

GET /users/mypage HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ *
Referer: https://secure.example.com/users/login
Accept-Language: en-gb
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: secure.example.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c...

请注意,它发送了两个 cookie,一个是在登录后收到的,另一个是旧的。它在主页上接收了旧的,设置为。它还将其发送到 .它不会被上面的标头替换,而是将其添加为附加 cookie。我怎样才能阻止它这样做?example.compath=/secure.example.com

Internet-Explorer 蛋糕PHP Cookie http-headers

评论

0赞 David Yell 4/6/2010
也许在创建新 cookie 之前尝试专门删除旧 cookie?
0赞 deceze 4/6/2010
@David我以为这就是我正在做的事情。我还能如何在同一个标题中做到这一点?

答:

4赞 EricLaw 4/8/2010 #1

一个常见的问题是,第二次尝试设置 cookie 缺少正确的 P3P 标头,因此触摸 cookie 的尝试将被忽略。

如果发布整个流的标头(例如,使用 Fiddler 捕获和查看),这将很有帮助

评论

0赞 deceze 4/8/2010
在摆弄了Fiddler之后,我想我找到了问题的根源,请再看看这个问题。
2赞 EricLaw 4/8/2010
当您有两个同名的 cookie 时,典型的问题是,您要么使用两个不同的 PATH 属性设置相同的 cookie,要么使用两个不同的 DOMAIN 属性设置相同的 cookie。后者通常发生在用户以 //example.com 身份访问您的网站,然后以 //www.example.com 身份重新访问时。如果您的网站不小心总是在不设置 cookie 的情况下重定向到 www.example.com,那么您最终会得到两个。由于 cookie 域继承的性质,两者都会在您访问 www.example.com 时发送。最简单的检查方法?访问 //example.com 并检查!
0赞 EricLaw 4/8/2010
当我更仔细地阅读你的问题时,在我看来,你已经知道这就是问题所在。若要修复此问题,请将 DOMAIN=example.com 属性添加到所有 SET-COOKIE 响应标头。
3赞 eglasius 4/14/2010 #2

确保针对您的基本域发出 Cookie。

这很可能是问题所在,因为这种行为在不同的浏览器中肯定会有所不同。

我还没有在 cakephp 中做过,但这应该可以工作

评论

0赞 deceze 4/14/2010
是的,这就是问题所在。我通过链接的方法添加。谢谢!ini_set('session.cookie_domain', '.example.com')
2赞 pestilence669 4/14/2010 #3

这里可能有两个问题。首先,在@freddy-rios中给出一个镜头。如果这不行,那么您可能会遇到 IE“重定向 cookie 错误”。

IE 在重定向过程中并不总是支持 cookie 修改。如果您在登录表单上分配了会话 ID,并且不更改它,则重定向应该可以正常工作。如果您在重定向时更改 cookie,那么您最终可能会得到旧的会话......浏览器将简单地将旧的cookie提交到新的URL(可以说,它应该做什么......重定向原始请求)。

有几种方法可以解决这个问题。到目前为止,最丑陋的是使用 Javascript 或 META 标签重定向。只要您通过这些 cookie 的非 300,浏览器几乎总是会接受它们。

如果你正在使用 ,简单地删除它可能会解决你所有的问题......特别是如果它在引擎盖下打电话。$this->Session->renew()session_regenerate_id()

我建议删除重定向,看看它是否仍然是一个问题。如果是这样,那么你可以忽略我所说的一切。:)