encabezado mal formado del script. Bad header=1: index.php
http-headers malformed (4)
Tengo un sitio web que tiene algunos años, básicamente ofrece descargas.
De todos modos, dado que la gente del servidor en movimiento no puede descargar los archivos porque ahora muestra un error de error 500 y en los archivos de registro está generando este error:
encabezado mal formado del script. Bad header = 1: index.php
El único código que está relacionado con esto que puedo ver de todos modos es este:
// 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;
}
Ahora si acabo de salir:
// Echo $productOptionDetails->file;
$file = DOWNLOAD_FOLDER. ''/''. $productOptionDetailEntity->file;
if (file_exists($file)) {
readfile($file);
exit;
}
Emite una gran cantidad de texto cifrado por lo que obviamente está leyendo algo.
Lo que he leído es que los encabezados son incorrectos, pero después de leer un montón de contenido en php.net, así como en otros sitios web, se ve bien.
¿Alguien puede dar un grito sobre por qué estoy recibiendo estos errores?
Gracias
En función de lo que haya dicho, el problema se debe a que hay algo que usted dijo antes de escribir el código para descargar. Para superar este problema, debe escribir el código para que el echo
se escriba después del código de descarga en el momento en que se debe realizar la descarga.
Puede que no siempre sea un echo
, pueden ser algunas HTML tags
lugar de un echo
.
La descarga debe ser lo primero que se ejecute en cualquier página si desea descargar algo de esa página al sistema de los clientes.
Este problema está relacionado con algún resultado que aparece antes de enviar encabezados.
Es un problema común que algunos caracteres como espacios, nuevas líneas o incluso UMF-8 con formato incorrecto BOM (marca de orden de bytes) se colocan antes de iniciar la etiqueta php.
Debe asegurarse de que no se repita nada en absoluto antes de enviar encabezados y debe verificarlo para todos los archivos incluidos en su secuencia de comandos.
Además, ob_clean (); y flush (); las funciones no son necesarias en tu código.
Por lo que puedo entender del código flush()
no es necesario. También en lugar de usar
ob_clean();
flush();
solo use ob_end_clean()
para borrar cualquier código almacenado.
Y dijo que estaba moviendo servidores y que ahora no funciona, ¿significa que también ha modificado la configuración o la versión de PHP?
Si es así, publique la configuración de PHP para output_buffering
.
El problema está en
header(''Content-Length: '' . filesize($file) + 1);
El punto se evalúa antes que el más, de modo que su código es cadena + 1, el resultado es 1 y esto hace que 1 se envíe como encabezado. El código correcto debe ser
header(''Content-Length: '' . filesize($file));
porque según esta página http://www.php.net/manual/en/function.readfile.php no se usa +1. Otra solución es
header(''Content-Length: '' . (filesize($file) + 1));
que funcionará como quieras.