我的CakePHP应用程序出现问题。这似乎只发生在IE中,并且仅在某些计算机上发生。虽然它在计算机上是一致的。
问题一: 用户已登录并在页面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-ssl和Cookie not renewing/overwriting in IE但我仍然遇到同样的问题。
到目前为止,我注意到的唯一线索(我不知道这是否意味着什么)是我在HTTP页面上同时调试$_SESSION
和$this->Session->read()
时只需$ this-> Session-> read()返回一个值。在HTTPS页面上,有些人总是为两者返回相同的值,其他人总是只返回$ this-> Session-> read()的值。
例如,http://example.com和https://example.com/users永远不会看到$ _SESSION,https://example.com/carts总是会看到$ _SESSION。我不确定,但我在想,也许安全页面可能会看到它,因为有些可能不会出现问题,但是当我检查代码时,我看到没有区别,这表明为什么一个人做,一个人没有吨。
另外,如果我将$this->Session->destroy()
添加到AppController中的beforeFilter,那么所有页面甚至HTTP都可以看到$ _SESSION。我实际上并没有在我的应用程序中使用$ _SESSION,我只是觉得这可能是一个错误的线索。
更新
我接受了Gustav Bertram的建议并查看了用户代理字符串。我在没有问题的计算机上将用户代理字符串与IE上的IE进行了比较。它们是相同的,除了有问题的用户代理字符串中有“google chrome frame”。我从该计算机上卸载了Google Chrome Frame,重新启动,再次尝试,问题似乎已经解决了。
如果这是真正的原因,那么简单的解决方案就是让用户卸载Chrome框架。但是我想知道是否有一个解决方案可以让他们安装镀铬框架并且仍能正常工作。
答案 0 :(得分:16)
尝试将以下内容添加到您的core.php文件中:
Configure::write('Session.checkAgent', false);
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false));
这些参数应该强制Cookie即使通过Google Chrome Frame也能保留。这将设置PHP和CakePHP的设置,以允许cookie通过http和https保持。
答案 1 :(得分:6)
我的建议是你直接查看数据包,看看cookie发生了什么。
在客户端计算机上安装Wireshark,然后连接到远程Web服务器。 (Wireshark将忽略localhost流量。)
我怀疑你的cookie要么被破坏了(我曾经有一些被PHP破坏的cookie!)或者它们被卡住(这将是IE的错)。无论哪种方式,您都会获得有关出错的更多信息。
作为最后的手段,请检查代码中的用户代理字符串是否存在违规/不受支持的IE版本,并敦促人们进行升级。
答案 2 :(得分:0)
尝试将它放在AppController的beforeFilter中,看看它是否有效。我觉得cookie设置没有像你需要的那样配置。 See here了解更多信息。
function beforeFilter() {
$this->Cookie->domain = '.example.com';
$this->Cookie->secure = false;
}
答案 3 :(得分:-1)
关闭php后,您确定没有任何空格或换行吗?>标签?也许这是你检查的第一件事,但根据经验,我知道严重关闭的php标签确实会导致php会话处理的零星问题。