PHP中header Location跳转不生效,$access条件判断正确该如何解决
PHP header Location跳转失效问题排查与解决
核心原因
- 跳转头发送前存在提前输出:PHP要求所有header头必须在向浏览器输出的实际内容之前发送,你代码中
header("location: ...")之前执行了var_dump($access),这行打印操作直接触发了输出,会导致跳转头失效。如果你的环境关闭了PHP错误提示,就看不到对应的"headers already sent"告警,很难直接定位问题。除了显性的打印语句,PHP文件开头<?php前的空格、换行、UTF-8 BOM头,或者被引入的其他文件提前输出内容,也会触发同样的问题。 - 跳转后未终止程序执行:即便跳转头成功发送,PHP默认会继续执行后续代码,你代码中跳转后还运行了
$this->view->form()等逻辑,后续产生的输出会直接覆盖跳转指令,导致跳转不生效。
修复方案
- 清除所有header发送前的输出:删除或注释掉
var_dump($access)语句,同时检查当前文件、所有被引入的关联文件,确保<?php标签前没有多余字符,?>标签后也不要留空行、空格。 - 跳转后立即终止程序执行:在header跳转语句后添加
exit或者die,阻止后续代码运行。 - 可选优化:跳转头的
Location字段官方规范要求首字母大写,小写虽然大部分环境兼容,但大写适配性更好。
修复后代码示例
public function appel(array $submit, array $signin) { $access = $this->model->getLogin($submit); // 注释或删除提前输出的语句 // var_dump($access); if($access){ header("Location: index.php?controller=category&action=list"); // 新增终止执行语句 exit; } $this->view->form(); $this->model->inscrit($signin); }
补充排查方法
如果修改后还是无法跳转,可以在文件最开头临时添加以下代码开启错误提示,根据提示的报错位置排查其他提前输出的点:
error_reporting(E_ALL); ini_set('display_errors', 1);
内容的提问来源于stack exchange,提问作者Victor Briand
相关产品推荐
相关产品推荐

