CI 3.1.8中set_cookie()函数失效问题求助
我之前也碰到过类似的坑,结合你的代码、配置和项目结构,梳理了几个大概率的原因和对应的解决办法,你可以逐一排查:
1. 别忽略Cookie前缀的影响
你的config里设置了$config['cookie_prefix'] = 'e_';,这意味着你代码里命名为pre的Cookie,最终在浏览器里的实际名称是e_pre,而不是你预期的pre。你可能一直在Chrome的Cookie列表里搜pre,自然找不到——先确认是不是这个最容易被忽略的问题!
2. Cookie路径配置可能不匹配访问路径
从你的项目目录来看:
- 如果你是通过
http://localhost/project.com/catch/访问项目,那$config['cookie_path'] = '/project.com/catch/';是正确的; - 但如果你配置了本地虚拟主机(比如把
project.com直接指向htdocs/project.com),实际访问路径是http://project.com/catch/,那路径就得改成'/catch/'。
你可以先临时把路径改成'/'(根路径)测试,如果这时候能看到Cookie,就说明原路径配置和当前访问的URL路径不匹配。
3. .localhost域名的兼容性问题
Chrome对.localhost这个特殊域名的处理有限制,毕竟localhost是回环地址的专属域名,建议你:
- 要么把
$config['cookie_domain']改成空字符串'',或者直接设为'localhost'; - 要么更推荐的方式:在本地hosts文件里配置自定义测试域名(比如
project.test指向127.0.0.1),然后把Cookie域名改成.project.test,这样既符合生产环境的配置逻辑,也能避开浏览器对localhost的特殊处理。
4. 规范调用set_cookie的方式
你当前的调用是:
$this->input->set_cookie( $cookie['name'], $cookie['value'], $cookie['expire'] );
其实CodeIgniter支持直接传入数组参数,这样会自动读取config里的前缀、域名、路径等配置,不容易出错,建议改成:
$this->input->set_cookie($cookie);
5. 检查是否有提前输出内容
Cookie是通过HTTP响应头设置的,如果在调用set_cookie()之前有任何输出(比如echo语句、PHP文件开头的空格/换行、视图里的提前输出),都会导致响应头提前发送,Cookie设置直接失效。你可以检查ControllerFile.php和关联的视图文件,确保没有这类问题,也可以确认下CI的输出缓冲区是开启状态(默认是开启的)。
6. 清理浏览器旧Cookie缓存
有时候浏览器里残留的旧Cookie会干扰新Cookie的显示,建议你清除Chrome中所有与localhost或测试域名相关的Cookie,重启浏览器后再测试。
你可以先从第1点和第3点开始排查,这两个是这类问题最常见的诱因。
内容的提问来源于stack exchange,提问作者Khrisna Gunanasurya

