2011-11-01 118 views
19

我遇到了CakePHP应用程序的问题。这似乎只发生在IE中,并且仅在某些计算机上。它在发生这种事情的计算机上是一致的。CakePHP Cookie /会话问题

问题之一: 用户已经登录并https://example.com/users/view在页面上点击并注销。用户被重定向到http://example.com,并且似乎被注销,直到用户访问另一个https页面,并且他们仍然登录。他们可以多次单击注销,但他们总是通过https登录并仅登录HTTP。

问题二:在https://example.com/users/signin他们将被重定向到http://example.com现在出现 用户日志中记录用户去https://example.com/admin/slides,不知道它,但现在已经退出,点击任何其他网页上(。或者刷新当前页面)会要求他们重新登录。

我不知道发生了什么事。我已阅读并尝试了解决这两个类似问题的解决方案:Session not saving when moving from ssl to non-sslCookie not renewing/overwriting in IE,但我仍然遇到同样的问题。 (我不知道这是否意味着什么)是当我在HTTP页面上同时调试$_SESSION$this->Session->read()时总是只有$ this-> Session-> read()返回一个值。在HTTPS页面上,一些总是返回相同的值,其他人总是只返回$ this-> Session-> read()的值。

例如,http://example.comhttps://example.com/users从来没有看到$ _SESSION,https://example.com/carts总是看到$ _SESSION。我不确定,但我想,也许安全页面应该看到它,因为有些不可能有可能是错误的,但是当我检查代码时,我看不出有什么区别,说明它为什么会这样做,吨。

此外,如果我将$this->Session->destroy()添加到AppController中的beforeFilter,那么所有页面甚至HTTP都可以看到$ _SESSION。我实际上并没有在我的应用程序中使用$ _SESSION,我只是认为这可能是什么错误的线索。


UPDATE

我tooked古斯塔夫·伯特伦的意见,并看了看用户代理字符串。我将计算机上遇到问题的IE浏览器的用户代理字符串与计算机上没有问题的IE进行了比较。除了有问题的用户代理字符串中有“谷歌浏览器框架”之外,它们是相同的。我从那台电脑上卸载了Google Chrome Frame,重新启动,再次尝试,问题似乎解决了。

如果这是真正的原因,那么简单的解决方案是让用户卸载Chrome框架。不过,我想知道是否有解决方案可以让他们安装铬框架并仍能正常工作。

+0

(我认为你已经淘汰了平常的缓存嫌疑人。)哪些版本的IE?修改页面标题(缓存控制,等 - 请参阅http://support.microsoft.com/kb/234067)有什么影响? – OpenSorceress

+0

会话内容是乱码还是其他?可能是安全选项.. – Dunhamzzz

+0

页面是否有任何Flash内容?您是否尝试将会话安全性从HIGH更改为LOW? – binoy

回答

16

尝试添加以下到您的core.php中的文件:

Configure::write('Session.checkAgent', false); 
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false)); 

这些参数应该强制饼干甚至可以通过谷歌Chrome Frame的坚持。这将设置PHP和CakePHP的设置,以允许cookie通过http和https持久化。

+0

想到我会提到这些是CakePHP 2.0参数。它们在1.3中可能有点不同,但应该允许您在登录时在http和https之间导航。 –

+0

它看起来像1.3的语法,在1.3中工作,没有错误。 :)这似乎确实解决了问题,即使安装了铬框架。你知道为什么Cake首先检查代理吗?对不起,我已经捐出了这笔赏金,但当我这样做的时候,它即将耗尽。 –

+0

这是一项安全措施。我认为,默认情况下,它希望安全cookie只在安全连接中有效。如果你去http,那么它不再安全。所以,在这里,我们基本上已经把它关掉了。不用担心赏金。真高兴你做到了! –

6

我的建议是,你直接看看数据包,看看发生了什么事。

在客户机上安装Wireshark,并连接到远程Web服务器。 (Wireshark会忽略本地主机的流量。)

我怀疑你的cookies是不是受到了破坏(我曾经有一些饼干被PHP弄坏了!)或者他们被卡住了(这会是IE的错误)。无论哪种方式,您都会获得更多关于发生问题的信息。

作为最后的手段,检查代码中的用户代理字符串是否有问题/不支持的IE版本,并督促人们进行升级。

+0

我给你赏金自从你的建议看着用户代理是什么导致我发现铬框架问题。尽管如此,我仍然想找出一种方法使其可以与Chrome框架一起工作。 –

+0

显然你可以插入一个标签[强制IE浏览器使用Chrome浏览器渲染引擎](http://www.zdnet.com/blog/google/google-chrome-frame-hijacks-ie-and-is-现在考虑的稳定/ 2485)。如果这不能给你带来欢乐,那可能是bug报告时间。 –

-1

您是否确定在关闭php之后没有任何空格或换行符?>标记?也许这是你检查的第一件事,但根据经验我知道,严重关闭的php标签确实会导致php会话处理的零星问题。

0

试着把它放在你的AppController的beforeFilter中,看看它是否做了什么。我有一种感觉,cookie设置没有像你需要配置。 See here欲了解更多信息。

function beforeFilter() { 
    $this->Cookie->domain = '.example.com'; 
    $this->Cookie->secure = false; 
}