¿Alguna vez te has encontrado con el error “Cannot modify header information – headers already sent”? Si has llegado a este artículo probablemente sí. En español se podría traducir como “No se puede modificar la información de cabecera – cabeceras ya envidas”.

El error no se refiere al <head> o cualquier otra “cabecera” del HTML, sino a las cabeceras HTTP, y se produce cuándo se da salida a información desde el programa PHP y posteriormente se intentan modificar esas cabeceras. Si se ha dado salida a alguna información desde el servidor, las cabeceras ya han sido enviadas, no puede haber salida de información sin cabeceras.

Y si las cabeceras ya han sido enviadas, ¿como las vamos a modificar? Imposible hacerlo. Por eso aparece el error.

Causas y solución

La causa más evidente de este problema es el uso de funciones que imprimen información, por ejemplo print o echo, antes de funciones que modifican las cabeceras, por ejemplo header() o setcookie(), ya que generan la situación descrita: se da salida a información, y esa información lleva sus respectivas cabeceras HTTP, y luego se intenta modificar esas cabeceras.

Hay que tener en cuenta que dentro de un archivo PHP, cualquier símbolo que no esté entre las etiquetas <?php y ?> también genera salida. Por ejemplo, un simple espacio antes de <?php ya genera salida de información. De hecho, este fallo “tonto” del espacio, u otro símbolo, antes de <?php es de las causas más comunes del error “Cannot modify header information”.

La primera solución a intentar es buscar estos fallos en tu código, por ejemplo, algo tan sencillo como esto dará el error:

  <?php
  header("Content-Type: text/html; charset=UTF-8");
?>

O esto otro también:

<html>
<body>
  <?php
     header("Content-Type: text/html; charset=UTF-8");
  ?>
</body>
</html>

Y esto también:

<?php
echo( 'Hola mundo!' );
header("Content-Type: text/html; charset=UTF-8");

El enemigo BOM

Si buscas los fallos anteriores y no los encuentras puedes desesperarte. Y es que puede que no los tengas. La otra gran causa del error de modificación de cabeceras es el carácter BOM (Byte Order Mark).

Este carácter es, técnicamente, un espacio de anchura cero no separable (zero-width no-break space) y es utilizado por algunos editores de texto en Windows para indicar que la codificación del texto es UTF-8, UTF-16 o UTF-32. Y los caracteres BOM producen salida de información en PHP, de ahí que generen el error.

Una solución rápida puede ser no utilizar UTF-8, pero no es nada recomendable. UTF-8 es la codificación estándar en Internet. La solución es utilizar editores de texto que te permitan trabajar con UTF-8 pero sin BOM, por ejemplo Notepad++. Abre tu archivo PHP y guárdalo con codificación UTF-8 sin BOM y súbelo de nuevo al servidor.

UTF-8 sin BOM en Notepad++
UTF-8 sin BOM en Notepad++

Y si no sabes en que archivo PHP puedes tener caracteres BOM, puede que te sea útil este script PHP para eliminarlos de forma automática. Si los quieres eliminar de forma manual, puede que no te sea fácil. Al ser caracteres de anchura cero, los caracteres BOM no se muestran en muchos editores de texto.

Resumiendo

Ante un error del tipo “Cannot modify header information”:

  • Comprueba que no hay una línea, espacio en blanco, texto, HTML o cualquier otro tipo de contenido antes de la etiqueta <?php de inicio.
  • Comprueba que tampoco hay nada de eso antes del uso de funciones como setcookie(), header() o cualquier otra función de PHP que genere cabeceras HTTP.
  • Comprueba que el archivo no contiene caracteres BOM. Guárdalo en UTF-8 sin BOM utilizando un editor apropiado.
  • Es aplicable al error “Cannot modify header information – Headers already sent” y otros de naturaleza similar como “Cannot send session cache limiter” o “Cannot send session cookie”.