Problema con las cabeceras de respuesta HTTP en PHP
Según las reglas de HTTP, primero se envían
las cabeceras HTTP y luego el cuerpo de la respuesta HTTP.
Debido a esto, trabajar con la función header
en PHP tiene sus peculiaridades.
El problema es que si hay alguna salida a la pantalla
antes de llamar a esta función,
se interpretará como el inicio
del cuerpo de la respuesta. En este caso, la llamada
a la función header llevará
a una advertencia de PHP con el texto
headers already sent.
Incluso puede que las cabeceras se envíen.
Puede que ni siquiera se muestre el error (depende de la
configuración de PHP). Pero la mayoría de las veces esto solo pasará
en el entorno local, y al desplegar el sitio en internet
todo se romperá.
Por salida a la pantalla se entiende cualquier texto. Por ejemplo, así:
text
<?php
header('Content-Type: text/html');
?>
O una línea vacía:
<?php
header('Content-Type: text/html');
?>
O un espacio:
<?php
header('Content-Type: text/html');
?>
O una etiqueta:
<div>
<?php
header('Content-Type: text/html');
?>
</div>
O salida mediante echo:
<?php
echo 'abc';
header('Content-Type: text/html');
?>
O salida mediante var_dump:
<?php
$str = 'abc';
var_dump($str);
header('Content-Type: text/html');
?>
Incluso las advertencias de PHP serán salidas a la pantalla. En el siguiente ejemplo se accede intencionadamente a una variable inexistente, lo que llevará a la salida de una advertencia:
<?php
$text += 1;
header('Content-Type: text/html');
?>
La ruptura de las etiquetas de PHP también genera salida a la pantalla:
<?php
echo 'abc';
?>
<?php
header('Content-Type: text/html');
?>
Cree intencionadamente una salida a la pantalla
antes de la función header.
Estudie el texto del error que se produce.
Corrija el error cometido en este código:
<!DOCTYPE html>
<html>
<head>
<?php
header('Content-Type: text/html');
?>
</head>
<body>
text
<body>
<html>