Cookie不会在IE中续订/覆盖

时间:2010-04-05 05:14:44

标签: internet-explorer cakephp cookies http-headers

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

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

      

    的CakePHP =删除; expires = Sun,05-Apr-2009 04:50:35 GMT;路径= /
       CakePHP的= 98hnIO23 ...;到期=周一,2010年4月12日04:50:36 GMT;路径= /;安全

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

  5. 这适用于所有浏览器,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,即登录后收到的cookie,还有旧的cookie。它在主页example.com上收到了旧版本,设置为path=/。它还会将请求发送给secure.example.com。它不会被上面的标题取代,而是将其添加为额外的cookie。我怎么能阻止它呢?

3 个答案:

答案 0 :(得分:4)

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

如果您发布了整个流程的标题(例如,使用Fiddler进行捕获和查看),将会很有帮助

答案 1 :(得分:3)

确保为您的基本域发出Cookie。

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

我还没有在cakephp中完成,但是this should work

答案 2 :(得分:2)

这里可能有两个问题。首先,给@freddy-rios中的链接发布一个镜头。如果没有这样做,那么您可能会遇到IE“重定向cookie错误。”

IE在重定向期间并不总是遵守cookie修改。如果您在登录表单上分配会话ID,并且不更改它,则重定向应该可以正常工作。如果你正在改变重定向的cookie,那么你可能最终会得到旧的会话...浏览器只会将旧的cookie提交给新的URL(可以说,它应该做什么...重定向原始请求)。

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

如果您使用的是$this->Session->renew(),只需删除它就可以解决所有问题...尤其是如果它正在调用session_regenerate_id()

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