PHP会话变量传递失败:未定义索引错误排查求助
PHP会话变量跨页丢失(未定义索引)问题排查
1. 先确认会话启动的姿势对不对
- 两个页面的最开头必须先调用
session_start(),而且这行代码之前绝对不能有任何输出——包括空格、换行、HTML标签,不然会话cookie发不出去,自然传不了变量。
给你贴正确的极简示例:
page1.php:
page2.php:<?php session_start(); $_SESSION["name"] = "xxx"; echo $_SESSION["name"]; // 这里能正常显示就没问题 header("Location: page2.php"); exit; // 跳转后一定要加exit终止脚本,别让后续代码干扰 ?><?php session_start(); // 别直接echo,先判断索引存在不,避免报错 echo isset($_SESSION["name"]) ? $_SESSION["name"] : "没拿到会话变量"; ?>
2. 扒一扒php.ini里的会话配置
打开你的php.ini,重点查这几个配置项:
session.save_path:这个路径必须存在,而且Apache进程要有读写权限。Windows下比如设成session.save_path = "C:/xampp/tmp",Linux下一般是/var/lib/php/sessions,权限改700就行。session.cookie_domain:本地用localhost测试的话,这个值要么留空,要么设成localhost,别填IP或者自定义域名,不然cookie跨不过去。session.cookie_secure:本地是HTTP环境,这个必须设为Off,要是开成On,只有HTTPS请求才会带会话cookie,自然拿不到。session.use_cookies:必须设为On,PHP默认靠cookie存会话ID,关了的话得手动在URL里传ID,本地完全没必要搞这么麻烦。session.use_only_cookies:建议开成On,安全点,避免URL传ID的风险。
改完配置一定要重启Apache,不然白改。
3. 验证会话ID是不是同一个
在两个页面都加一行输出会话ID的代码:
<?php session_start(); echo "会话ID:" . session_id(); ?>
如果两个页面的ID不一样,说明会话cookie没传过去——要么是php.ini的cookie配置错了,要么是浏览器禁用了cookie(去浏览器设置里看看,允许本地站点存cookie)。
4. 排除浏览器的锅
- 别用隐私模式测试,隐私模式可能会阻止cookie存储。
- 清一下浏览器的缓存和cookie,再重新测一遍。
5. 检查Apache的rewrite规则
如果你的项目里有.htaccess文件,看看有没有自定义的rewrite或者重定向规则,会不会不小心改了请求头里的cookie信息,导致会话ID丢了。
内容的提问来源于stack exchange,提问作者TheOtherDave
相关产品推荐
相关产品推荐

