必须调用 exit(或 die),因为 header('location: ...') 仅发送 http 响应头而不终止脚本,后续代码执行可能导致输出冲突、重定向失效或安全风险,php 8.0 对输出控制更严格。

PHP 8.0 中使用 header('Location: ...') 重定向后必须调用 exit(或 die),是因为重定向本身只是向浏览器发送一个 HTTP 响应头,并不终止脚本执行。若不显式终止,后续代码仍会继续运行,可能造成意外输出、逻辑错误甚至安全风险。
重定向只是发头,不是跳转指令
HTTP 重定向依赖客户端(浏览器)响应 Location 响应头并主动发起新请求。PHP 的 header() 函数仅负责把该头写入响应,它不控制浏览器行为,也不中断当前 PHP 脚本流程。脚本会照常往下执行——哪怕你已经“告诉”浏览器该去哪了。
不加 exit 可能导致输出冲突
一旦脚本后续输出任何内容(包括空格、换行、echo、HTML、错误信息等),就会触发“headers already sent”警告,且重定向头将失效(因 HTTP 头必须在正文前发送)。常见情况有:
- 重定向后还有
echo "登录成功"; - 文件末尾存在多余空行或 UTF-8 BOM
- 开启
display_errors时发生 Notice/Warning,也会输出到响应体 - 自动加载器或日志写入产生隐式输出
PHP 8.0 对输出控制更严格
相比早期版本,PHP 8.0 在输出缓冲和头发送校验上更严谨。例如:
- 即使启用
output_buffering,若重定向后脚本继续执行并最终输出内容,浏览器仍可能收到混合响应(先 302 + Location,再 200 + HTML),导致页面显示异常或重定向被忽略 - 某些 SAPI(如 FPM)在 header 发送后检测到后续输出,会直接报错或静默截断,行为不可靠
推荐写法:重定向后立即 exit
标准安全写法是将重定向与终止组合成原子操作:
✅ 正确:
header('Location: /dashboard.php');<br>
exit;
⚠️ 危险:
header('Location: /dashboard.php');<br>
// 后续还有数据库更新、日志记录、echo 等……
也可封装为函数提升一致性:function redirect($url) { header("Location: $url"); exit; }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











