脚本中的标头格式不正确.错误的标头=1:index.php


malformed header from script. Bad header=1: index.php

我有一个网站,现在已经有几年的历史了,它基本上提供下载。

无论如何,由于移动服务器,人们无法下载文件,因为它现在给出了一个错误500错误,并且在日志文件中它带来了这个错误:

脚本中的标头格式不正确。错误的标头=1:index.php

我能看到的唯一与此相关的代码是:

// Echo $productOptionDetails->file;                
$file = DOWNLOAD_FOLDER. '/'. $productOptionDetailEntity->file;
    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file) + 1);
        ob_clean();
        flush();
        readfile($file);
        exit;
    }

现在,如果我只是输出:

// Echo $productOptionDetails->file;                
$file = DOWNLOAD_FOLDER. '/'. $productOptionDetailEntity->file;
if (file_exists($file)) {
   readfile($file);
   exit;
}

它输出大量加密文本,所以它显然在读一些东西。

我读到的是标题不正确,但在阅读了php.net和其他网站中的大量内容后,这看起来很好。

有人能说出我为什么会犯这些错误吗?

感谢

问题出在中

header('Content-Length: ' . filesize($file) + 1);

点在加号之前求值,所以您的代码是字符串+1,结果是1,这导致1作为标头发送。正确的代码应该是

header('Content-Length: ' . filesize($file));

因为根据这一页http://www.php.net/manual/en/function.readfile.php不使用+1。另一种解决方案是

header('Content-Length: ' . (filesize($file) + 1));

它会按照你的意愿工作。

根据您所说的,问题是因为在编写要下载的代码之前,您对echo说过一些话。为了克服这个问题,您应该编写代码,以便在执行下载时在下载代码之后编写echo

它可能并不总是一个echo,它可能是一些HTML tags而不是它

如果你想从任何页面下载一些东西到客户端的系统,下载应该是在任何页面上运行的第一件事。

此问题与发送标头之前出现的某些输出有关。

常见的问题是,一些字符(如空格、新行,甚至UTF-8格式的BOM(字节顺序标记))在启动php标记之前被放置。

在发送标头之前,您需要确保绝对没有回音,并且需要检查脚本中包含的所有文件。

此外,ob_clean();和flush();代码中不需要函数。

据我所知,不需要flush()。也不用

ob_clean();
flush();

只需使用ob_end_clean()来清除任何缓冲的代码。

你说你正在移动服务器,现在它不工作了,这是否意味着你也修改了PHP设置或版本?

如果是,则发布output_buffering的PHP配置。