如何忽略 PHP 中的重定向错误


how to ignore redirection errors in php

>我在php中收到了这个警告:

Cannot modify header information - headers already sent by (output started at

当我分别安装 mysql、apache 和 php 时,但当我使用 Wamp 时,警告不存在,页面会正常重定向。

我已经尝试将错误报告设置为仅显示错误而不显示警告,发生的事情是警告没有显示,但页面也没有重定向。

我知道这已经被认为是不好的做法,但我的代码库有很多这样的代码,修改它们可能会给代码带来新的错误。有没有办法在 php 中完全忽略此警告?

避免(而不是忽略)此问题的经典方法是输出缓冲,ob_start() 和 ob_flush()。在任何输出之前启动缓冲,并显式完成刷新,或者它可能会自动执行此操作。这将捕获任何输出而不是打印它,因此输出的任何标头都会在任何可见内容之前完成。

不过,从错误消息中的文件名修复输出错误是解决此问题的最佳方法。在不需要时从文件中删除结束的"?>"可能会有所帮助。

这是一个可怕的做法,但只是设定

error_reporting(0);

在脚本的开头。否则在 php 中设置它.ini

display_errors = Off

编辑 - 可能您在重定向之前输出了一些东西。我曾经花了三天时间调试这个,原因有时是文件末尾的空格,或者您在重定向之前将一些 HTML 输出到浏览器的事实。
我通常从不关闭 php 标签以避免这种情况

即使您不显示错误,您的应用程序也无法正常工作。这是因为就像错误所说的标头已经发送一样。这意味着以下内容:浏览器在服务器上请求您的 php 文件。然后服务器执行此操作并发回生成的 html。此错误告诉您,在发送了 php 文件的结果后,您将某些内容发送回浏览器。因此,我建议您尝试修复您收到的错误,而不仅仅是不显示它。

您不能"忽略"此警告重定向。警告说得很清楚:

无法发送标题!标头已通过输出发送!

这意味着标头(Location标头无法发送,因为输出已发送。 (标头只能在任何和所有输出之前发送)。

RTM你需要修复你的错误,而不是忽略它们。


该错误是由于您在调用header()函数之前发送某种输出引起的,其原因可能是很多事情,当意外时,直接怀疑是某些文件的开头或结尾的空格。

 <?php //Note the space before the opening tag!
header("Location: this-will-fail.html");
?>

请注意,此错误准确指定了代码中开始将数据输出到浏览器的位置(请参阅output started at ...1,查找尾随空格''r,',制表符和空格)。从理论上讲,关闭错误报告不会导致页面重定向,因为标题已经发送,因此无法更改或添加。

如果您需要使用已发送的数据进行重定向,您应该做的是这样的:

if ( headers_sent() )    // Check if the headers were already sent
{
    echo( "<script>document.location.href='$url';</script>" );  // Use client side redirect
    die();  // Stop here
}
else
{
    header( "Location: $url" );  // Use server side redirect
}

但最好的办法是找出输出从哪里开始并修复它(如果可能的话)。