PHP中header(Location:...)跳转失效问题求助
解决PHP header()重定向失效的问题
既然你已经确认代码逻辑没问题(通过echo/print_r验证了字段和分支都符合预期),那这个重定向失效的问题基本可以锁定是HTTP响应头发送规则导致的——PHP的header()必须在任何输出(包括空格、HTML标签、echo内容)之前调用,否则会直接失效。下面是针对性的排查和修复方案:
1. 强制终止脚本执行(最容易忽略的点)
你在调用header("Location: account.php")之后还在执行setcookie的逻辑,虽然setcookie本身也是发送头操作,但最好在重定向头之后立即终止脚本运行,避免后续代码可能产生的意外输出,或者服务器端的缓冲问题影响头的发送。修改代码如下:
if (password_verify($_POST['password'], $row['password'])){ header("Location: account.php"); if ($_POST['stayLoggedIn'] == 1){ setcookie("id", $row["id"], time() + 60*60*24*365); } exit(); // 关键:终止脚本,确保后续无输出 // 或者用 die(); 效果一样 }
2. 排查提前输出的情况
这是header()失效最常见的原因,哪怕是一个看不见的空格都会导致问题:
- 检查当前PHP文件的
<?php标签之前有没有空白字符、换行或者HTML代码; - 检查这个代码块之前有没有
echo/print/var_dump等输出语句; - 检查是否引入了其他文件(比如
include/require的文件),那些文件里有没有提前输出内容。
如果不确定,可以在脚本最开头加上输出缓冲开启函数,强制把所有输出暂时缓存,直到脚本结束再发送:
ob_start(); // 放在所有代码最前面 // 你的注册/登录逻辑代码...
3. 用浏览器开发者工具验证响应头
打开浏览器的开发者工具(按F12,切换到「网络」标签),提交登录表单后查看对应的请求响应头:
- 如果看不到
Location: account.php这个响应头,说明header()根本没被正常发送,回到上面的步骤排查提前输出; - 如果能看到
Location头但浏览器没跳转,那可能是浏览器缓存问题,或者重定向路径有错误(比如account.php的相对路径不对,试试绝对路径/account.php)。
内容的提问来源于stack exchange,提问作者clcordell
相关产品推荐
相关产品推荐

