【问题标题】:PHP/Apache - how to see script warnings before header redirects?PHP/Apache - 如何在标头重定向之前查看脚本警告?
【发布时间】:2025-12-07 14:20:05
【问题描述】:

我使用了很多标头重定向,但因此我错过了一些由于重定向而未显示的 PHP 警告。如果发出任何警告,是否有一些 PHP/Apache 配置选项会停止标头重定向?

事实上,我希望任何警告都可以在我的开发机器上停止脚本执行(就像错误一样),但在其他服务器上不可见 - 这意味着一些配置设置而不是脚本的更改。那可能吗?我正在使用 Apache 2.2 和 PHP 5.2

所有警告都正常显示在我的开发服务器上,但是当它们后跟标头重定向时,我看不到它们。示例:

<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
unset($undef);
echo $undef; // generates warning, should stop redirect.
//exit; 
//when previous line is uncommented, I see the warning
header("Location: http://www.google.com"); // still happens, but shouldn't
exit;
?>

【问题讨论】:

  • 我的建议是在这样的环境中严重依赖您的错误日志。

标签: php apache


【解决方案1】:

在您的开发服务器上放置:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
ob_start();
...

if(ob_get_length() > 0){
    ob_flush();
    exit();
}
header(...);

在您的标头重定向之前(如图所示)。如果缓冲区中有任何内容,它将被显示,这将导致您的标头重定向失败,因为如果某些内容已呈现给浏览器,则无法进行标头重定向。如果您在生产服务器上将 display_errors 转换为 Off,则不会显示这些消息。

【讨论】:

  • 我把它放在脚本的顶部,并且在生成警告后仍然会发生重定向。我在 header() 调用之前回显了一些 $undefinedvariable,它会生成一个警告,但 header() 仍然会重定向。
  • 在您的问题中发布您遇到问题的代码。如果您认为正在生成警告,请在您的 header() 之前执行 exit() 以确认您的理论。
  • 如果我退出;在 header() 之前我看到一个警告。如果没有出口;然后重定向发生,就好像没有显示警告一样。这就是我通常在重定向之前通过退出检查警告的方式;就在 header() 调用之前,但是每次更改和更改回来都太麻烦了。
  • 请将您所看到的内容发布到您的问题中。我无法调试我看不到的东西。
  • 完成。我的开发服务器上的所有错误报告都已启用,只是出于某种原因警告不会破坏标头重定向。
【解决方案2】:

做这样的事情:

//header("location: such-and-such");

哈哈,但真的;它并不比这更简单。

【讨论】: