来自脚本的格式错误的标题错误的标头= 1:index.php

时间:2014-04-08 14:12:51

标签: php http-headers malformed

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

无论如何,因为移动服务器的人无法下载文件,因为它现在给出了错误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以及其他网站中的内容后,这看起来很不错。

任何人都可以大声说出我为什么会收到这些错误吗?

由于

4 个答案:

答案 0 :(得分:7)

问题在于

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));

可以按你的意愿工作。

答案 1 :(得分:0)

根据您所说的,问题是因为在您编写要下载的代码之前,您曾向echo说过某些内容。要解决这个问题,您应该编写代码,以便在下载代码执行时应在下载代码之后编写echo

它可能并不总是echo,而是HTML tags而不是{{1}}。

如果您想从该页面下载某些内容到客户端,那么下载应该是在任何页面中运行的第一件事。系统

答案 2 :(得分:0)

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

在启动php标记之前,会出现一些常见的问题,例如空格,新行甚至是UTF-8格式错误的BOM(字节顺序标记)。

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

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

答案 3 :(得分:0)

据我所知,代码flush()不需要。而不是使用

ob_clean();
flush();

只需使用ob_end_clean()清除所有缓冲的代码。

并且你说你正在移动服务器,现在它无法正常工作,这是否意味着你已经修改了PHP设置或版本?

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