【问题标题】:Suddenly Session datas destroyed when redirect page重定向页面时突然会话数据被破坏
【发布时间】:2019-07-01 05:28:58
【问题描述】:

我必须在多个子域中工作。突然我无法访问我的所有子域。因为页面重定向时会话数据丢失了。这个问题发生在我的所有子域中 但我没有从我的服务器上改变任何东西。任何人,请帮助我为什么突然发生此问题以及如何解决此问题 我的域托管在 cpanel 中。 但我的代码在 localhost 中完美运行

【问题讨论】:

  • 也许您将会话 cookie 设置为仅对顶级域有效?
  • 如何检查会话cookie是否只是顶级域?但是从昨天开始所有域都运行良好。但是突然发生了这个问题。假设我只设置了顶级域的会话 cookie,那么从昨天开始所有域都运行良好。
  • 你说得对,如果是昨天的问题,它就不会起作用。
  • 看不懂你的回答,请简单解释一下
  • 我同意你说的。

标签: php codeigniter session cpanel


【解决方案1】:

更新:此问题在 CI v3.1.1 中得到修复。请升级到 >= 3.1.1 以彻底解决此问题。

@prakasht - 我遇到了类似的问题,在寻找修复程序时发现了这个问题。对我来说,它发生在尝试升级 CI v2.2.6 --> v3.0.3

我的会话突然停止工作。我添加了一些日志来调试基于会话文件的驱动程序system/libraries/Session/drivers/Session_files_driver.php中的场景@

在我之前和现在的工作地点都有集中的会话,我发现不知何故,会话是根据我添加的日志为每个请求重新创建的。

作为一个懒惰的人,当我看到你的answer above时,我试图用谷歌搜索。

这是迄今为止我见过的最接近使用 Ci 解决此问题的人,因为其他人只是添加了 hack。我尝试自己调试文件system/libraries/Session/Session.php中的代码,发现清理preg_match()永远不匹配。

在正则表达式中试图检查cookie值试图匹配

if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )

我尝试将我的 cookie 值与正则表达式 ^[0-9a-f]{40}$ 匹配,但发现它失败了。因此,按照文件application/config/config.php 中的定义,我将正则表达式更改为^[0-9a-z_-]{1,40}$,这基本上意味着正则表达式可以匹配长度为1 - 40 的任何cookie 值,包括任何一个字符或集合@987654331 的组合@。

带有固定正则表达式的代码

if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-z_-]{1,40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )

这为我解决了问题。希望它对你也一样。

P.S.:我也替换了

的所有实例

$this->session->all_userdata()$this->session->userdata()

$this->session->set_userdata($key, $value)$this->session->key = $value

根据CI 2.2.x -> 3.x upgrade documentationSession library documentation 在我的代码库中

更新:此问题在 CI v3.1.1 中得到修复。请升级到 >= 3.1.1 以彻底解决此问题。

【讨论】:

    【解决方案2】:

    我更改了小修改 session.php 文件

    更改代码之前:

    // Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers
            if (isset($_COOKIE[$this->_config['cookie_name']])
                && (
                    ! is_string($_COOKIE[$this->_config['cookie_name']])
                    OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
                )
            )
            {
                unset($_COOKIE[$this->_config['cookie_name']]);
            }
    

    之后:

    我改成 32 而不是 40

    // Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers
            if (isset($_COOKIE[$this->_config['cookie_name']])
                && (
                    ! is_string($_COOKIE[$this->_config['cookie_name']])
                    OR ! preg_match('/^[0-9a-f]{32}$/', $_COOKIE[$this->_config['cookie_name']])
                )
            )
            {
                unset($_COOKIE[$this->_config['cookie_name']]);
            }
    

    在这种情况下,会话数据基于 cookie id 加载。但是 cookie id 最大为 32。但是之前的代码定义了 40。当 cookie id 在 33 和 40 之间时。会话数据丢失

    但我的疑问是之前的代码在 2 天前的 live 中如何运行良好?同时以前的代码仍在我的本地主机中工作?

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 1970-01-01
      • 2016-04-28
      • 2015-08-23
      • 2012-10-31
      • 2012-08-20
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      相关资源
      最近更新 更多