从ssl移动到非ssl时,会话不保存

Jus*_*tin 9 php session cakephp

我有一个登录屏幕,我强迫ssl,所以像这样:https: //www.foobar.com/login 然后他们登录后,他们被移动到主页:https: //www.foobar.com/dashbaord

但是,我想在登录后将人员从SSL中移除(以节省CPU),因此在检查到他们实际登录https://www.foobar.com/dashbaord后我将其移至 http:// www.foobar.com/dashbaord

好吧,这总是似乎消灭了会话变量,因为当页面再次运行时,它确认它们已登录(如同所有页面一样)并且会话似乎不存在,因此它将它们移动到登录屏幕.

奇怪/结果:

  1. 项目清单
  2. 第二次登录总是有效,并愉快地带我到http://www.foobar.com/dashbaord
  3. 它首次登录时成功创建了一个cookie
  4. 如果我登录两次,然后注销,再次登录,我不需要两次登录(我似乎已经跟踪了cookie存在的事实).如果我删除cookie,我会回到两次登录.
  5. 第二次登录后,我可以从ssl的非ssl移动,会话仍然存在.
  6. 在第一次登录时,移动到非ssl站点会彻底清除会话,手动移回ssl站点仍然会强制我再次登录.
  7. 第二次登录使用与第一次完全相同的机制,通过ssl

我尝试了什么:

  1. 使用Cake的security.level和session.checkagent设置 - 什么都没有
  2. 蛋糕存储在db中的会话(而不是文件系统) - 什么都没有
  3. 在XP机器上测试FF,IE,Chrome.

所以我觉得这与创建cookie但没有被阅读有关.

环境:1.Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6.会话正在保存PHP默认,作为文件

Jus*_*tin 4

我明白了这一点。Cake 在 SSL 连接下自动切换 session.cookie_secure ini 值,因此创建的 cookie 是一个安全 cookie,第二个页面无法识别。

解决方案,注释掉/cake/lib/session.php第420行ish:

ini_set('session.cookie_secure', 1);

(只需搜索即可找到它,因为我确信 # 行会随着版本的发布而改变。)

  • 甜蜜的提示。在 Drupal 土地上呆了很多年,当我看到核心 hack 时我都会冒冷汗。 (2认同)