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

问题描述 投票:1回答:2

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

php codeigniter session cpanel
2个回答
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时,我试图通过它google。

到目前为止,我已经看到有人用Ci解决这个问题,因为其他人都只是添加黑客。我试图在我自己的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值,包括任何一个中的字符或集合0-9, a-z, _ , -的混合。

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

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以完全摆脱此问题。


0
投票

我更改了一个小修改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天开始工作的?同时以前的代码仍在我的localhost中工作?

© www.soinside.com 2019 - 2024. All rights reserved.