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

流过昼夜 提交于 2019-12-01 17:11:34

问题


I have a website which is a few years old now, it basically offers downloads.

Anyway since moving server people can not download files because its now giving a error 500 error and in the log files it is bringing this error:

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

The only code which is related to this which I can see anyway is this:

// 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;
    }

Now if I just output:

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

if (file_exists($file)) {
   readfile($file);
   exit;
}

It outputs lots of encrypted text so its obviously reading something.

What I have read is that the headers are incorrect but after reading loads of content in php.net as well as other websites this looks fine.

Can anyone give a shout on why I am getting these errors?

Thanks


回答1:


The problem is in

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

Dot is evaluated before plus so your code is string + 1, result is 1 and this causes that 1 is sent as header. Correct code should be

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

because according to this page http://www.php.net/manual/en/function.readfile.php no +1 is used. Other solution is

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

which will work as you want.




回答2:


Based on what you said, the problem is because there is something you said to echo before you wrote the code to download. To overcome this problem you should write the code so as the echo should be written after the download code at the time the download should be get performed.

It may not always an echo, it may be some HTML tags instead of it.

Download should be the first thing to be run in any page if you want to download something from that page to clients' system.




回答3:


This problem is related to some output which appears before you send headers.

It is a common problem that some characters like spaces, new lines or even UTF-8 malformed BOM (Byte order mark) are placed before starting php tag.

You need to be sure that absolute nothing is echo-ed before sending headers and need to check that for all included files in your script.

In addition, ob_clean(); and flush(); functions are not needed in you code.




回答4:


As far as I can understand from the code flush() is not needed. Also instead of using

ob_clean();
flush();

just use ob_end_clean() to clear any buffered code.

And you said you were moving servers and now it is not working, does it means you have modified PHP settings or version too?

If yes than do post the PHP configuration for output_buffering.



来源:https://stackoverflow.com/questions/22939676/malformed-header-from-script-bad-header-1-index-php

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!