Cómo corregir "Headers already sent" en PHP: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: "Ya enviaste algo a la pantalla, y no puedo"

\n

Si alguna vez has visto en tu sitio web, en lugar de una página bonita, una pantalla blanca con un mensaje aterrador Warning: Cannot modify header information - headers already sent — no estás solo. Este es, quizás, uno de los errores más populares entre los desarrolladores PHP principiantes (y no solo). En Stack Overflow, esta pregunta ha acumulado cientos de miles de visitas, y la cantidad de copias de código incorrecto en el mundo se mide en terabytes.

\n

Pero la buena noticia es que el error «Headers already sent» no es una maldición, sino un simple recordatorio estricto de PHP: «Oye, ya empezaste a enviar código HTML, y ahora intentas modificar los encabezados HTTP. ¡Así no se puede!».

\n

En este artículo, analizaremos por qué ocurre el error headers already sent en PHP, cómo encontrarlo y, lo más importante, cómo corregirlo de una vez por todas. ¡Allá vamos!

\n\n

1. ¿Qué son los encabezados HTTP y por qué "ya se enviaron"?

\n

Antes de meternos en el código, entendamos de forma sencilla lo que sucede «bajo el capó». Cuando se ejecuta un script PHP, primero envía al navegador los encabezados HTTP (header). Estos contienen información de servicio: tipo de contenido (Content-Type), cookies (Set-Cookie), redirecciones (Location), estado de la respuesta (200, 404, 301), etc.

\n

Y solo después de todos los encabezados comienza el envío del cuerpo del documento — el HTML que ves en la página. PHP permite modificar los encabezados solo hasta el momento en que se ha enviado el primer byte de contenido.

\n

En cuanto muestras algo en pantalla (mediante echo, print, var_dump o incluso un simple espacio antes de <?php), PHP considera que los encabezados ya se enviaron. Cualquier intento de llamar a header(), setcookie() o session_start() después de esto provoca un error fatal.

\n\n

1.1. Ejemplo clásico del error

\n
<?php\necho "¡Hola, mundo!";\n// ¡Ups! Ya mostramos algo.\nheader("Location: https://example.com");\n// Warning: Cannot modify header information - headers already sent\n?>
\n

En este ejemplo, echo envía texto al cuerpo del documento. Después de eso, PHP no puede sobrescribir los encabezados para hacer una redirección. Todo es lógico.

\n\n

2. Top 5 causas de "Headers already sent"

\n

El error puede ser causado no solo por un echo explícito. Estos son los escenarios más comunes que atrapan incluso a desarrolladores experimentados:

\n
    \n
  • Espacio o línea en blanco antes de <?php — el "bug" más popular. Si en el archivo hay al menos un espacio antes de la etiqueta de apertura, se enviará a la salida.
  • \n
  • Caracteres invisibles BOM (Byte Order Mark) — el archivo se guardó en codificación UTF-8 with BOM. Los primeros 3 bytes (EF BB BF) se consideran salida.
  • \n
  • Salida de archivos incluidos — en el archivo config.php hay un espacio extra después de ?>.
  • \n
  • Errores y advertencias — si PHP muestra una advertencia (por ejemplo, sobre el uso de una variable no definida), esto también se considera envío de contenido.
  • \n
  • Funciones print, printf, var_dump antes de header() — cualquier función de salida rompe los encabezados.
  • \n
\n\n

3. Cómo encontrar la fuente del problema: 3 métodos

\n

Antes de corregir, hay que encontrar de dónde proviene la salida «extra». Usa uno de estos métodos.

\n\n

3.1. Activar la visualización de todos los errores

\n

Añade al inicio del script (antes de cualquier salida):

\n
<?php\nerror_reporting(E_ALL);\nini_set('display_errors', 1);\n?>
\n

PHP a menudo muestra la línea exacta donde ocurrió la salida. Busca un mensaje como Output started at /path/to/file.php:12.

\n\n

3.2. Usar la función error_get_last()

\n

Se puede interceptar el último error

Blogs

Book Recommendations