为什么PHP header跳转在XAMPP运行正常,线上虚拟主机却失效?
代码问题排查与解决方案
核心问题原因(header跳转失效)
PHP的header()函数要求执行前不能有任何实际输出(包括空格、空行、BOM头、PHP警告/报错信息),你的本地XAMPP环境默认开启了output_buffering(输出缓存),会自动缓存提前输出的内容,所以跳转正常;线上虚拟主机大多默认关闭该配置,只要有提前输出就会导致header失效,页面空白。
你代码里还存在以下几个会触发该问题的明显错误:
- DSN语法错误:你的DSN字符串中
port参数和charset参数之间缺少分号分隔,可能产生隐含警告输出,打断header发送:
原错误代码:
$dsn = "mysql:host={$host};dbname={$dbname};port={$dbport}charset=utf8mb4";
- 所有header跳转后未终止执行:你在每个
header()执行后都没有加exit/die,即便header跳转指令已经发出,后续代码还会继续执行,如果后续有输出内容就会覆盖跳转指令。 - 文件存在提前输出:如果你的PHP文件开头
<?php标签前有空行、空格,或者文件保存为带BOM的UTF-8格式,都会产生提前输出。
修复步骤
- 修正DSN语法,补全参数分隔符:
$dsn = "mysql:host={$host};dbname={$dbname};port={$dbport};charset=utf8mb4";
- 给所有
header()跳转语句后立刻添加exit;终止后续代码执行,示例:
header("location:User.php?error=Το όνομα είναι υποχρεωτικό!!#logariasmos"); exit; // 所有跳转后都要加这行
- 检查当前PHP文件,确保
<?php标签前没有任何空行、空格,将文件保存为无BOM的UTF-8格式。 - 如需快速定位具体报错,可在代码最开头
session_start();前添加两行代码临时开启错误显示:
error_reporting(E_ALL); ini_set('display_errors', 1);
提交注册后页面会输出具体报错信息,例如headers already sent by xxx即可直接定位到提前输出的位置。
内容的提问来源于stack exchange,提问作者Tzonatan Rotsi
相关产品推荐
相关产品推荐

