¿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 enviadas”.

El error quiere decir que PHP ya ha dado salida a las cabeceras HTTP cuando se ha encontrado con código que intenta modificar esas cabeceras. Pero una vez enviadas es imposible modificarlas. Por eso aparece el error.

Causas y solución

La causa más habitual de este problema es utilizar funciones que dan salida a información, por ejemplo con print o con echo, y luego intentar modificar las cabeceras, por ejemplo con header() o con setcookie(), ya que generan la situación descrita: se da salida a información, y esa información lleva sus respectivas cabeceras HTTP; no se pueden modificar después.

Hay que tener en cuenta que dentro de un script 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 “tontos” en tu código, por ejemplo, algo tan sencillo como esto provoca 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");

Pero esto, por ejemplo, no:

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

En este último ejemplo, primero se configura una cabecera HTTP y luego se da salida a información, como debe ser.

Las posibles combinaciones que producen esta situación son innumerables, estos son tan solo algunos ejemplos extremadamente básicos de por qué se produce el error.

A medida que un programa PHP va creciendo, encontrar el error puede ser tedioso, pero es más sencillo de lo que pueda parecer. Lo que hay que tener claro es que el error se debe a dar salida de información desde PHP y luego intentar modificar las cabeceras HTTP, y ese es el error que hay que buscar en nuestro código.

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 salida de información antes del uso de funciones como setcookie(), header() o cualquier otra función que genere o modifique las cabeceras HTTP.
  • Comprueba que el archivo no contiene caracteres BOM.
  • 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”.