【问题标题】:Why does php header redirect raise a warning?为什么 php 标头重定向会引发警告?
【发布时间】:2011-04-01 20:39:37
【问题描述】:

当我在 php 中使用标头(位置:...)重定向时会引发警告,为什么?

这是警告:

警告:无法修改标头信息 - 标头已由第 26 行 ~\addMarket1.php 中的(输出开始于 ~\index.php:51)发送

这是代码:

$folder = 'images/markets/';
$orig_w = 500;

if( isset($_POST['submit']) )
{
    $imageFile = $_FILES['image']['tmp_name'];
    $filename = basename( $_FILES['image']['name']);

    if(strstr($_FILES["image"]["type"],"image")){
            list($width, $height) = getimagesize($imageFile);

            $src = imagecreatefromjpeg($imageFile);
            $orig_h = ($height/$width)* $orig_w;

            $tmp = imagecreatetruecolor($orig_w, $orig_h);
            imagecopyresampled($tmp, $src, 0,0,0,0,$orig_w,$orig_h,$width,$height);
            imagejpeg($tmp, $folder.$filename,100);

            imagedestroy($tmp);
            imagedestroy($src);

            $filename = urlencode($filename);
            mysql_query("insert into photos (`image`) values ('$filename')");   
        //  echo '<meta http-equiv="refresh" content="0;URL=../Admin/?p=crop&filename=$filename&height=$orig_h">'; 
        header("Location: ../Admin/crop.php?filename=$filename&height=$orig_h");
    }
    else
    echo "The file uploaded is not image. Please choose jpg, png,gif or png image !";
}

【问题讨论】:

标签: php redirect header


【解决方案1】:

使用 HTTP [标头]2 (Location 之一) 进行重定向。

HTTP headers 只能在内容之前发送:生成页面时,服务器会:

  • 发送 HTTP 标头
  • 然后,发送 HTTP 响应的正文

这就是 HTTP 协议的工作方式——对此你无能为力。

如果正文已开始发送,则 HTTP 标头也已发送 - 一旦完成,您将无法再发送任何 HTTP 标头 - 这解释了警告。


两种可能的解决方案:

  • 最好的方法是:不发送任何输出 (甚至没有一个空格) 在尝试发送 HTTP 标头之前
  • 有点hacky:使用output buffering,所以输出保存在RAM中,而不是发送到浏览器——这意味着仍然可以发送HTTP头,即使输出已经开始正在生成。

注意:你可以使用headers_sent()函数来判断HTTP头是否已经发送。

【讨论】:

    【解决方案2】:

    编辑:他的代码是正确的。他在header('Location:...'); 之后失踪了exit; 因此,当他尝试进行 302 重定向时,它仍在发送当前文档的标头。

    【讨论】:

    • 虽然我在自己的回答中简要提到了这一点,但请注意,当 BOM 出现问题时,输出从第 1 行开始。警告消息(抱怨第 26 行)放弃了这种可能性。
    【解决方案3】:

    检查您的初始&lt;?php 是否从文件的最开头开始(UTF BOM 在这方面可能很糟糕,但事实并非如此);并确保在完成标题之前没有?&gt;。

    然后,查看您调用的每个函数:其中一个正在产生一些输出。实际上,它必须是出现在文件第 26 行的那个。如果您不希望它产生输出,请检查该函数的文档以了解它产生它的原因。或者使用第 26 行的内容更新您的问题,以便我们更好地帮助您。

    PS:还要检查该警告之前的完整输出(查看源代码)。了解正在输出的内容可能有助于找出为什么输出它;)

    【讨论】:

      【解决方案4】:

      来自 PHP 手册:

      记住 header() 必须被调用 在发送任何实际输出之前, 通过普通的 HTML 标签,空白 文件中的行,或来自 PHP。它是一个 读取代码时非常常见的错误 include() 或 require() 函数,或 另一个文件访问功能,并具有 输出的空格或空行 在调用 header() 之前。相同 使用单个时存在问题 PHP/HTML 文件。

      所以如果你想重定向,它必须是你的脚本,或 HTML输出的第一件事。

      【讨论】:

      • 但我不能放在第一行,应该在它之前再写一段代码
      • 它不必是第一行代码,只要是发送的第一行。因此,您的 或 标签。也不能有任何 echo() 调用或任何其他将信息发送到浏览器的东西。
      • ...或者任何有输出的脚本的 include(),或者即使它没有输出,它也可以发送一些字节(例如,保存为 UTF8 文本的脚本文件)
      【解决方案5】:

      扩展我上面的评论:

      考虑到您注释掉的&lt;meta&gt; 标记的位置,我敢打赌,在您的脚本调用header() 之前,您已经输出了一些HTML。

      在header() 调用之前,您不能将任何数据发送到浏览器。

      【讨论】:

        【解决方案6】:

        你可以添加

        ob_start();
        

        在文档的顶部,它会消失

        【讨论】:

          猜你喜欢
          • 2019-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-21
          • 2015-10-02
          • 2012-07-21
          • 1970-01-01
          • 2011-11-11
          相关资源
          最近更新 更多