当session.cookie_lifetime = 0时,为什么会话在浏览器关闭时没有到期?

Pan*_*end 6 php apache session

我设置了一个PHP编码网站的测试版本,该网站使用会话来处理用户登录.在测试服务器上,会话将在浏览器关闭时到期,因为将所有内容复制到"干净"的实时服务器,会话在浏览器关闭时保持不变,即使在完全系统重新启动后的第二天,用户仍然登录.

在php.ini中

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
session.cookie_lifetime = 0

这意味着它应该在浏览器重启时到期.

我想也许它被覆盖了某个地方,但如果我在PHP中打印session_get_cookie_params我得到

Array
(
    [lifetime] => 0
    [path] => /
    [domain] => 
    [secure] => 
    [httponly] => 
)
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Tia*_*oon 9

如果您使用谷歌浏览器

如果你设置"继续我离开的地方",chrome将恢复你的浏览数据和会话cookie.

甚至Facebook登录(没有"记住我")会话保留.

了解更多信息

谷歌铬设置


lis*_*nko 5

此处的问题是Firefox具有称为“还原上一个会话”的功能。如果有人在关闭时使用保存选项卡,那是一样的。当浏览器恢复上一个会话时,所有会话cookie也将恢复:)

因此,您的会话Cookie可以永远存在。您可以在Firefox会话cookie中阅读更多内容


sym*_*ean 3

我本来打算将其添加为对亚历山大出色答案的评论,但它会变得有点冗长。

cookie 在浏览器上保留多长时间以及在没有请求的情况下会话数据在服务器上保留多长时间是两个独立的事情。由于 HTTP 的无状态性质,无法避免这种情况 - 尽管您可以采取一些措施来减轻您认为的安全缺陷。

为了让浏览器在关闭后访问相同的会话并出现一些延迟,需要浏览器保留会话 cookie(亚历山大已经解释过)并且服务器保留会话数据。

您描述的行为在处理少量请求的系统上可能更加明显,并且会话处理程序不验证会话数据的 TTL(我不确定默认处理程序是否这样做,或者他们是否只是假设任何未删除的会话数据被视为当前数据)。

您没有提供有关如何配置这两个服务器的任何详细信息,特别是 session.gc_maxlifetime。

如果 session.gc_maxlifetime 在请求之间已过期,但会话数据仍然可以访问,这意味着会话处理程序仅将此视为会话被认为有资格进行垃圾收集的时间(从语义上讲,这就是配置选项的用途) )。然而,有充分的理由将此值视为 TTL。为了解决这个问题,您可以强制垃圾收集更频繁地运行并删除会话数据,或者使用会话处理程序来忽略早于指定限制的会话数据。

您看到两个系统之间的差异可能是由于 session.gc_maxlifetime 的不同值或垃圾收集频率的差异,甚至是不同的会话处理程序造成的。