【问题标题】:Lost PHP sessions with Internet Explorer and Lighttpd webserver与 Internet Explorer 和 Lighttpd 网络服务器的 PHP 会话丢失
【发布时间】:2015-10-12 20:52:52
【问题描述】:

我在使用 IE11 和 Edge (Windows 10) 连接到 Lighttpd 网络服务器时遇到问题。

考虑这段代码:

if (PHP_SESSION_NONE === session_status()) {
    session_start();
}

$x = isset($_SESSION['bob'])? $_SESSION['bob']  : 'nothing';
echo 'The Session has started, bob is set to ' . $x .'<br/>';

$_SESSION['bob'] = 'hope';

echo 'The Session ID is ' . session_id() .'<br/>';

当我浏览到包含上述代码的 test.php 时,使用 Chrome,关闭 Chrome,重新打开 Chrome,然后浏览回此页面,它会显示:

The Session has started, bob is set to hope
The Session ID is 6d2jbpmrrlrqt96h2nd19ua160

IE11 和 Edge 将显示:

会话已开始,bob 设置为空 会话 ID 为 35k87vgdt7t41q4lkphq815hq1

为什么 IE11 和 Edge 会丢弃会话?

**这个问题也发生在 WAMP Apache 上,所以虽然我已经看到对 Lighttpd 的引用是一个潜在的原因 (Internet Explorer, jQuery, session lost php, ),但我并不相信。

** 此外,Fiddler 会为每个 IE\Edge 连接显示一个新的会话 ID。

有什么想法吗?

【问题讨论】:

  • session_start() 是否在每一页的顶部?我个人喜欢将它与我的 SQL 资料放在一起,因为我的所有 SQL 页面都可能还需要会话数据。
  • 为了测试,只有一页顶部带有 session_start 的页面。在实际代码中,它包含在大多数其他 php 脚本所需的共享文件中。

标签: php internet-explorer session microsoft-edge lighttpd


【解决方案1】:

使用 session_set_cookie_params 为会话添加 cookie 生命周期,例如:

    if (PHP_SESSION_NONE === session_status()) {
    session_set_cookie_params(60*60*24*7);
    session_start();
}

解决问题:关闭并重新打开浏览器后会话仍然存在。

php 文档http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime 指出:

session.cookie_lifetime 以秒为单位指定发送到浏览器的 cookie 的生命周期。值 0 表示“直到浏览器关闭”。默认为

http://php.net/manual/en/function.session-set-cookie-params.php

这引发了为什么它可以在 Chrome (45.0.2454.101 m) 中运行的问题?但这是另一个问题...

脚注:虽然会话 cookie 的最大生命周期值似乎是 2,147,483,647,但“session.gc_maxlifetime”的最大值似乎是 65535;并将生命周期设置为更大的值会阻止我的会话工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多