// 文件保存为无 BOM 的 UTF-8,且不要写 ?>
ob_start();
header('Location: /login');
exit;
// 排查
// php -l index.php
调用 header 做跳转时报警告,提示输出已经开始,检查代码前面并没有 echo。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,文件开头有 BOM 或闭合标签后有空白字符,被当作输出提前发送。
「PHP header 已发送」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
处理上按这个顺序:检查文件编码与结尾空白;去掉不必要的闭合标签;用输出缓冲兜底。
改完只确认一件事:跳转不再出现警告,响应头能正常设置并生效。