CodeIgniter 3 Session失效 登录后跳转回登录页问题排查
两个同域部署的CodeIgniter 3项目使用了完全相同的Session Cookie名称ci_session,且未配置独立的Cookie作用域、独立Session存储路径,导致浏览器存储Session ID的Cookie互相覆盖,是触发该问题的核心原因。
单独访问项目2时,登录写入的Session ID会被同名下的无效Cookie覆盖,后端无法读取到有效会话数据,就会判定用户未登录重定向到登录页;先登录项目1时,浏览器会先生成有效的ci_session Cookie记录,后续登录项目2时会话写入、读取链路正常,所以不会触发重定向。
第一步:修改两个项目的Session Cookie名称,彻底避免重名冲突
同浏览器下同域下的同名Cookie会互相覆盖,分别给两个项目设置独立的Cookie名称即可解决核心冲突,修改application/config/config.php配置:// 项目1配置,设置独立标识 $config['sess_cookie_name'] = 'ci_session_proj1'; // 项目2配置,不要和项目1重名 $config['sess_cookie_name'] = 'ci_session_proj2';第二步:补全Cookie作用域配置,限制Cookie仅在当前项目路径下生效
在两个项目的config.php中补充Cookie路径配置,避免跨项目读取、写入Cookie:
若两个项目访问地址分别为http://localhost/proj1、http://localhost/proj2,配置如下:// 项目1配置 $config['cookie_path'] = '/proj1/'; $config['cookie_domain'] = ''; // 本地测试留空,线上配置对应服务域名 // 项目2配置 $config['cookie_path'] = '/proj2/'; $config['cookie_domain'] = '';若两个项目为同域名不同端口部署,
cookie_path统一设置为'/'即可,只要保证sess_cookie_name不重名就不会出现冲突。第三步:全局自动加载Session库,避免会话读取异常
当前代码仅在登录方法中加载Session库,其他业务页面如果未手动加载Session库,会直接出现无法读取会话数据的问题。修改application/config/autoload.php文件,将Session加入全局自动加载列表:$autoload['libraries'] = array('session');配置完成后删除LoginController中手动加载Session库的代码
$this->load->library('session');,避免重复加载触发异常。第四步:配置独立Session存储路径,确认目录权限
不建议多个项目共用/tmp作为Session存储目录,避免不同项目的Session文件互相干扰,给每个项目创建独立的Session存储目录,分别配置到对应项目的sess_save_path参数中:// 项目1配置 $config['sess_save_path'] = '/tmp/ci_proj1/'; // 项目2配置 $config['sess_save_path'] = '/tmp/ci_proj2/';创建目录后确认目录权限为1777,保证PHP运行进程对目录有读写权限,执行以下命令修复权限(Linux环境):
chmod 1777 /tmp/ci_proj1 /tmp/ci_proj2
注意:检查配置文件名不要拼写错误,Session相关配置必须写在
application/config/config.php文件中,文件名拼写错误会导致所有配置不生效。
- 清除浏览器中对应站点的所有Cookie,关闭浏览器后重新打开
- 单独访问项目2,完成登录后依次点击各页面、按钮跳转,确认不会被强制重定向到登录页
- 分别打开两个标签页登录项目1、项目2,交叉切换操作,确认两个项目的登录状态都能正常保持,不会出现互相踢下线的问题。
内容的提问来源于stack exchange,提问作者dev

