为什么php header redirect会引发警告?

时间:2011-04-01 20:39:38

标签: php redirect header

当我在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 !";
}

6 个答案:

答案 0 :(得分:2)

使用 HTTP [标题] 2 Location一个)进行重定向。

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

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

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

如果正在开始发送正文,那么HTTP标题也已经被发送 - 一旦完成,你就不能再发送任何HTTP标题了 - 这解释了警告。


两种可能的解决方案:

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

注意:您可以使用headers_sent()函数来确定是否已发送HTTP标头。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

检查您的初始<?php是否在文件的最开头(UTF BOMs在这方面可能很讨厌,但事实并非如此);并且在完成标题之前确保没有?>

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

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

答案 3 :(得分:0)

从PHP手册:

  

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

因此,如果您想重定向,则必须首先执行您的脚本 HTML输出。

答案 4 :(得分:0)

扩展我的评论:

考虑到已注释掉的<meta>代码的位置,我愿意打赌您已经在脚本点击header()来电之前输出了一些HTML。

header()来电之前,您无法将任何数据发送到浏览器。

答案 5 :(得分:0)

您可以添加

ob_start();

位于文档的顶部,它将消失