同一域名下PHP页面间Session丢失,如何排查解决?
1. Cookie 路径不匹配
从跳转路径 ../different_page.php 能看出,login.php 处于子目录,而 different_page.php 在根目录。PHP 默认会把 Session Cookie 的路径设置为当前脚本所在目录(比如 /auth/),这会导致根目录的页面无法读取到该 Cookie,自然拿不到 Session 数据。
解决方法:在 login.php 的 session_start() 前设置 Cookie 路径为根目录:
session_set_cookie_params([ 'path' => '/', 'httponly' => true ]); session_start();
2. Session 存储目录权限不足
PHP 默认把 Session 文件存在服务器临时目录(如 /tmp),如果服务器对该目录没有读写权限,Session 数据无法保存,后续页面自然读不到。
排查方式:在 login.php 中加入测试代码,查看目录是否可写:
var_dump(is_writable(session_save_path()));
如果返回 false,需要给 Session 存储目录设置正确的读写权限(比如赋予运行 PHP 的用户权限)。
3. 文件开头存在多余输出
如果两个 PHP 文件开头有空格、换行或者 UTF-8 BOM 字符,会导致 session_start() 无法正常发送 Session Cookie,进而丢失 Session。
解决方法:用编辑器打开文件,确保开头没有任何多余字符,保存为无 BOM 的 UTF-8 格式。
4. 脚本执行流程问题
session_write_close() 提前调用可能导致 Session 未完全写入就跳转,加上 ob_start() 的缓冲机制,可能存在数据未落地的情况。可以调整代码逻辑:
<?php session_start(); ob_start(); $id = 10; $name = "test"; $_SESSION['member_id'] = $id; $_SESSION['member_name'] = $name; header("location: ../different_page.php"); ob_end_flush(); exit; ?>
5. 浏览器 Cookie 禁用
如果用户浏览器禁用了 Cookie,Session ID 无法通过 Cookie 传递,different_page.php 就无法关联到之前创建的 Session。
排查方式:打开浏览器开发者工具,查看「Application/Storage」中的 Cookie 列表,确认是否存在 PHPSESSID 条目。如果没有,检查浏览器 Cookie 权限设置。
6. PHP 配置不一致
检查 php.ini 中的关键配置,确保两个页面的 Session 配置一致:
session.cookie_path:需设置为/以支持跨目录读取session.save_path:指向可读写的目录session.use_cookies:需设置为Onsession.name:确保两个页面的 Session 名称一致(默认是PHPSESSID)
可以在页面中加入 phpinfo(); 查看这些配置的实际值。
内容的提问来源于stack exchange,提问作者noname noname

