PHP开发中$_SESSION变量在第二个页面访问无输出问题求助
故障原因
session_start()调用时机错误:PHP要求session_start()必须在任何实际输出(包括HTML标签、空格、UTF-8 BOM头、echo输出内容)之前执行,你第一页的session_start()写在了多行业务代码之后,只要之前有任意输出,就会导致session cookie下发失败,session无法正常创建。- 末尾斜杠处理逻辑缺陷:原代码用
substr_replace($withlastSlash, "", -1)强行删除最后一位字符,如果当前请求URL末尾本身没有斜杠,会误删正常的路径字符,可能导致变量异常,但通常不会引发完全无输出的问题。 - 跨域/跨协议问题:如果两个页面的域名(比如一个带www一个不带)、协议(一个http一个https)不一致,session cookie会因为作用域不匹配无法传递,导致第二页读不到session。
- 服务器环境问题:PHP配置的session存储目录无读写权限、浏览器禁用cookie,都会导致session无法正常保存或传递。
修复方案
- 调整
session_start()位置到所有代码最顶部,第一页代码修改如下:
<?php // 必须放在代码最顶部,前面不能有任何输出内容 session_start(); $youtubeID = get_sub_field('youtube_id'); $withlastSlash = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // 用rtrim代替substr_replace,只会删除末尾的斜杠,不会误删正常字符 $withoutSlash = rtrim($withlastSlash, '/'); $howtoURL = $withoutSlash . "?a=" . $youtubeID; $_SESSION['howtovidsurl'] = $howtoURL; ?>
- 第二页代码同样保证
session_start()放在最顶部:
<?php session_start(); // 调试时可以先打印整个session数组确认内容 // var_dump($_SESSION); echo $_SESSION['howtovidsurl']; ?>
- 额外排查项:
- 确认两个页面域名、协议完全一致
- 检查服务器
session.save_path配置对应的目录是否有读写权限 - 调试阶段开启PHP错误提示,确认没有
headers already sent类的警告
内容的提问来源于stack exchange,提问作者Bob Smith
相关产品推荐
相关产品推荐

