php location header redirect 即使在输出开始后仍然有效

php location header redirect works even after output has started

如果您已经发送了一些输出,我认为您不能在 php 中使用 header('location:.. 进行重定向。但是,此测试程序在本地服务器上按(非)预期的方式工作。

$ cat > index.php
Hello,
<?php

if ($_SERVER['REQUEST_URI'] !== "/") {
  header('location: /');
  die();
}

?>
World!

然后我像这样启动 php 本地服务器

$ php -S localhost:8000

然后当我转到 http://localhost:8000/index.php?test=1 时,它会将我重定向到 http://localhost:8000

为什么我已经发送了输出却没有抱怨? php 7 有什么不同吗?现代浏览器有什么不同吗?演示服务器有什么不同?或者我需要做一些稍微不同的事情来得到我上次使用 php 时遇到的错误吗?

我试过你的脚本,对我来说它报告了预期的 "Cannot modify header" 警告并且只显示 "Hello,".

可能与您不同的主要是 php.ini 中的 output_buffering 变量 - 如果未禁用它,它会自动将输出缓冲到一定大小。因此,请检查它是否设置为 "On" 或类似 4096 的值。默认值如果关闭,但有很多启用它的示例配置。