CodeIgniter 3.0会话失效:每次请求自动重生成会话Cookie
解决CodeIgniter 3.x数据库会话持续重生成、登录后自动登出问题
从你的测试结果和描述来看,核心问题是每次请求都会生成新的会话记录,浏览器Cookie无法关联到原有会话ID,导致会话数据丢失、登录后自动跳回登录页。结合CI3的会话机制,我整理了几个针对性的排查和修复步骤:
1. 先确认会话表结构是否正确
CI3的数据库会话表有严格的结构要求,如果表字段类型不对,会导致会话ID无法匹配,进而触发每次请求新建会话。请对比你的ci_sessions表,确保结构和下面的SQL一致:
CREATE TABLE IF NOT EXISTS `ci_sessions` ( `id` varchar(128) NOT NULL, `ip_address` varchar(45) NOT NULL, `timestamp` int(10) unsigned DEFAULT 0 NOT NULL, `data` blob NOT NULL, KEY `ci_sessions_timestamp` (`timestamp`) );
重点注意:
id字段必须是varchar(128)(CI3的会话ID是长哈希值,旧版本的短字段会截断ID)data字段是blob类型,用于存储序列化的会话数据
如果结构不符,建议备份现有数据后重新创建表。
2. 修正Cookie域名配置(最常见的问题)
你的Cookie域名设为空,这在部分环境下会导致浏览器认为当前域名无法共享Cookie,每次请求都不携带旧Cookie,CI只能生成新会话。
- 线上生产环境:如果你的域名是
xxx.com,请设置:$config['cookie_domain'] = '.xxx.com'; // 注意前面的点,支持www和非www子域名共享 - 本地测试环境:根据你访问的地址设置:
- 用
localhost访问:$config['cookie_domain'] = 'localhost'; - 用IP(如127.0.0.1)访问:
$config['cookie_domain'] = '127.0.0.1';
- 用
3. 检查反向代理IP配置(如果网站用了代理/CDN)
如果你的网站部署在Nginx反向代理、CloudFlare等CDN后面,CI可能会错误获取代理服务器的IP而非用户真实IP,即使你设置了$config['sess_match_ip'] = FALSE,也可能触发会话重生成。
在config.php中添加你的代理IP段:
$config['proxy_ips'] = '192.168.0.0/16, 10.0.0.0/8'; // 替换成你的代理服务器IP
4. 验证PHP全局会话配置是否冲突
CI的会话配置可能被PHP.ini的全局设置覆盖,创建一个phpinfo.php文件(内容<?php phpinfo(); ?>),访问后查看session模块的以下配置:
session.cookie_domain:必须和CI的$config['cookie_domain']一致session.cookie_secure:如果你的网站用HTTPS,需要设为TRUE,否则设为FALSE,和CI的$config['cookie_secure']保持一致session.gc_maxlifetime:值不能小于CI的$config['sess_time_to_update'](你设的是86400,所以这个值至少要86400)
5. 排查自定义代码或钩子的干扰
检查是否有自定义代码强制销毁/重生成会话:
- 查看
config/hooks.php,确认没有在pre_system、post_controller等钩子中调用$this->session->sess_destroy()或$this->session->sess_regenerate() - 检查是否修改过CI核心的
Session.php文件,或者自定义了会话库
最后测试
按照上面的步骤调整后,重新测试你的Test控制器:
- 访问
/a,查看浏览器Cookie是否生成了rozsess记录 - 访问
/b,查看是否能读取到test字段 - 登录后观察数据库会话表,是否不再每次请求都生成新记录
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

