重定向页面时突然会话数据被破坏

Posted

技术标签:

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

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

【问题讨论】:

也许您将会话 cookie 设置为仅对***域有效? 如何检查会话cookie是否只是***域?但是从昨天开始所有域都运行良好。但是突然发生了这个问题。假设我只设置了***域的会话 cookie,那么从昨天开始所有域都运行良好。 你说得对,如果是昨天的问题,它就不会起作用。 看不懂你的回答,请简单解释一下 我同意你说的。 【参考方案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 documentation 和Session 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 中如何运行良好?同时以前的代码仍在我的本地主机中工作?

【讨论】:

以上是关于重定向页面时突然会话数据被破坏的主要内容,如果未能解决你的问题,请参考以下文章

沙盒重定向会破坏会话

重定向后不保留会话数据

为啥页面重定向在 php 中不起作用

重定向页面时 Laravel Auth 会话丢失

会话范围和 jsf 重定向

如何在laravel 5.5中会话时自动重定向到登录页面