【问题标题】:how to ignore redirection errors in php如何忽略php中的重定向错误
【发布时间】:2012-04-13 09:44:57
【问题描述】:

我在 php 中收到此警告:

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

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

我已经尝试将错误报告设置为只显示错误而不显示警告,结果是警告没有显示但页面也没有重定向。

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

【问题讨论】:

  • 我的代码超级复杂并且包含错​​误。让我们不要修复错误,而是将它们隐藏在地毯下! ... 严重地?您收到此错误是有原因的。找出原因并解决它。
  • 这不是一个好的做法,我当然希望你能重新考虑。找出错误并修复它们。
  • stackoverflow.com/questions/8028957/…给出了超详细的答案

标签: php


【解决方案1】:

避免 - 而不是忽略 - 这个问题的经典方法是使用 output buffering、ob_start() 和 ob_flush()。在任何输出之前开始缓冲,并显式地完成刷新,或者它可能会自动完成。这会捕获任何输出而不是打印它,因此输出的任何标头都会在任何可见内容之前完成。

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

【讨论】:

    【解决方案2】:

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

    error_reporting(0);
    

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

    display_errors = Off
    

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

    【讨论】:

    • 在 php.ini 中设置 display_errors = Off 会有类似的效果吗?如果是,那么它也不起作用,错误不会显示,但页面也不会重定向。
    • @KyokaSuigetsu 可能你在重定向之前输出了一些东西。我曾经花了三天时间调试这个,原因有时是文件末尾的空格:
    • 我也已经删除了相关文件中的所有空格。但我仍然得到这个错误。我不知道 wampserver 在他们的 php 安装中做了什么样的配置,但它只是神奇地工作而没有问题。
    • wampserver 可能在 php.ini 文件中默认设置了输出缓冲。
    • @AlisterBulman:谢谢!这解决了我的问题。我不会再使用 Wampserver 了。但我只关心启用输出缓冲的效果。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      这意味着标头(Location 标头无法发送,因为输出已经发送。(标头只能在 any and all 输出之前发送)。

      RTM,您需要修复您的错误,而不是忽略强>他们。


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

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

      【讨论】:

        【解决方案5】:

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

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

        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
        }
        

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

        【讨论】:

          猜你喜欢
          • 2011-06-30
          • 2020-09-29
          • 2011-12-18
          • 2012-03-30
          • 2017-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多