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

Rob*_*ert 5 php malformed http-headers

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

无论如何,因为移动服务器的人无法下载文件,因为它现在给出错误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;
    }
Run Code Online (Sandbox Code Playgroud)

现在如果我输出:

// Echo $productOptionDetails->file;                
$file = DOWNLOAD_FOLDER. '/'. $productOptionDetailEntity->file;

if (file_exists($file)) {
   readfile($file);
   exit;
}
Run Code Online (Sandbox Code Playgroud)

它会输出大量加密文本,因此它显然可以阅读.

我读过的是标题不正确但在阅读了php.net以及其他网站中的内容后,这看起来很好.

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

谢谢

Tom*_*mas 7

问题在于

header('Content-Length: ' . filesize($file) + 1);
Run Code Online (Sandbox Code Playgroud)

在加号之前评估点,因此您的代码是字符串+ 1,结果是1,这导致1作为标题发送.应该是正确的代码

header('Content-Length: ' . filesize($file));
Run Code Online (Sandbox Code Playgroud)

因为根据这个页面http://www.php.net/manual/en/function.readfile.php没有使用+1.其他解决方案是

header('Content-Length: ' . (filesize($file) + 1));
Run Code Online (Sandbox Code Playgroud)

这将按你的意愿工作.