【问题标题】:Why don't sessions start properly in Internet Explorer and Google Chrome, but work fine in Firefox?为什么会话在 Internet Explorer 和 Google Chrome 中不能正常启动,但在 Firefox 中可以正常工作?
【发布时间】:2015-02-08 01:52:03
【问题描述】:

我问(并回答)这个问题主要是因为我在任何其他类似的 SO 问题中都找不到与我的具体情况完全匹配的东西,我读到的任何问题也没有完全符合我的解决方案成立。我希望这将在未来使其他人受益。

我正在尝试设置一个非常严格的会话 cookie,该 cookie 仅对我网站的管理部分有效,因此我使用 session_set_cookie_params() 来执行此操作。这是原始代码:

  // Set session parameters
  $session_name = 'PGO_Admin';
  $session_lifetime = 86400; // 24 hours, expressed in seconds
  $session_cookie_path = './'; // This session is only valid within the confines of the admin folder
  $session_cookie_domain = filter_input(INPUT_SERVER,'HTTP_HOST');
  session_set_cookie_params($session_lifetime, $session_cookie_path, $session_cookie_domain);
  session_name($session_name);
  session_start();

此代码在 Firefox 中运行良好,但在 IE 和 Chrome 中失败。在 Firefox 中,如果我输入一些 PHP 代码来显示 $_SESSION 的内容,我会得到:

<!-- SESSION vars:
Array
(
    [GitHubVersion] => 2.4.5
    [poadmin] => Array
        (
            [curPage] => main
            [uid] => 1
            [name] => Dave
            [lip] => 127.0.0.1
            [prior_login] => Tuesday 9th of December 2014 03:11:56 PM
            [ip] => 127.0.0.1
            [last_login] => Tuesday 9th of December 2014 03:42:51 PM
            [bot_id] => 1
            [bot_name] => Test
            [logged_in] => 1
        )
)
-->

这是我期望看到的。然而,在 IE 或 Chrome 中,相同的代码只会产生一个空数组:

<!-- SESSION vars:
Array
(
)
-->

如果我注释掉对 session_set_cookie_params() 的调用,脚本会正常运行,但设置的 cookie 在站点内的任何地方都可以访问,这对我来说是不可接受的。在我的头撞墙几个小时后,我终于找到了一个非常简单的解决方案。请参阅我的答案以获得解决方案。

【问题讨论】:

    标签: php google-chrome internet-explorer session firefox


    【解决方案1】:

    这是我的理论:

    似乎 Firefox “理解” './' 表示当前目录路径,而 IE 和 Chrome 则不然。他们期望来自服务器文档根目录的“完整路径”,在我的例子中是“/Program-O-master/admin/”。有了这些知识,我以以下方式修改了代码:

      $session_name = 'PGO_Admin';
      $session_lifetime = 86400; // 24 hours, expressed in seconds
      $session_cookie_domain = 'http://' . filter_input(INPUT_SERVER,'HTTP_HOST');
      $session_cookie_path = str_replace($session_cookie_domain, '', _ADMIN_URL_);
      /* The constant _ADMIN_URL_ is set earlier, in a different file */
      session_set_cookie_params($session_lifetime, $session_cookie_path, $session_cookie_domain);
      session_name($session_name);
      session_start();
    

    这设置了“正确”的 cookie 路径,现在我测试过的所有浏览器(包括前面没有提到的几个)都按预期工作。我希望这对以后的其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2014-08-12
      • 1970-01-01
      相关资源
      最近更新 更多