【发布时间】:2011-02-04 08:14:00
【问题描述】:
我对 IE 中的 cookie 有一个奇怪的怪癖。当用户登录网站时,我正在生成一个新的会话 ID,因此需要覆盖 cookie。流程基本上是:
- 客户端转到
https://secure.example.com/users/login页面,自动接收会话ID - 客户端将登录凭据发布到同一地址
-
客户端收到以下 set-cookie 标头以及 302 重定向到
https://secure.example.com/users/mypage:CAKEPHP=已删除;过期=星期日,2009 年 4 月 5 日 04:50:35 GMT;路径=/
CAKEPHP=98hnIO23...; expires=2010 年 4 月 12 日星期一 04:50:36 GMT;路径=/;安全 客户端应该访问
https://secure.example.com/users/mypage,提供新的会话ID。
这适用于所有浏览器,除了 IE(在 7 和 8 中测试)。 IE 保留旧的、未经身份验证的会话 ID,并被重定向回登录页面。它适用于我的本地测试环境(使用https://localhost:8443/... 的自签名证书),但不适用于实时服务器。
我正在使用 CakePHP,只需发出 $this->Session->renew(),它会生成上述 cookie 标头。
任何想法如何让 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,一个是登录后收到的,一个是旧的。它在主页example.com收到旧的,设置为path=/。它还将请求发送到secure.example.com。它不会被上述标头替换,而是将其添加为附加 cookie。我怎样才能阻止它这样做?
【问题讨论】:
-
也许尝试在创建新cookie之前专门删除旧cookie?
-
@David 我认为这就是我正在做的事情。在同一个标题中我还能怎么做?
标签: internet-explorer cakephp cookies http-headers