Redirección en PHP: 5 errores fatales y cómo evitarlos

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: por qué redirigir en PHP no es solo header('Location:')

\n\n

Cualquiera que haya escrito algo en PHP se ha enfrentado a la tarea de redirigir al usuario a otra página. Parece sencillo, ¿verdad? Una línea header('Location: /nueva-pagina'); y listo. Pero en la práctica, este mecanismo simple se convierte en un dolor de cabeza para miles de desarrolladores. No es casualidad que la pregunta «How do I make a redirect in PHP?» en Stack Overflow tenga millones de visitas.

\n\n

El problema es que una redirección en PHP no es solo llamar a una función, sino todo un proceso que es fácil de romper. ¿Alguna vez has visto el error «Cannot modify header information»? ¿O has notado que la redirección funciona, pero la página igual se carga? O, peor aún, ¿te has topado con que la redirección no funciona y el usuario ve una página en blanco?

\n\n

En este artículo analizaremos los 5 errores más comunes al crear una redirección en PHP, aprenderemos a corregirlos y descubriremos cómo hacer que la redirección sea segura y predecible. ¡Vamos allá!

\n\n

Error #1: Redirección después de mostrar contenido (Header already sent)

\n\n

El problema

\n

El error más común entre principiantes es intentar enviar la cabecera HTTP Location después de que el navegador ya haya recibido código HTML o incluso un simple espacio en blanco. PHP lanza un error fatal: «Cannot modify header information - headers already sent».

\n\n

¿Por qué ocurre?

\n

El protocolo HTTP exige que las cabeceras se envíen estrictamente antes del cuerpo de la respuesta. En cuanto PHP muestra algo en pantalla (con echo, print, o incluso una línea vacía antes de <?php), las cabeceras ya están fijadas y no se pueden modificar.

\n\n

Ejemplo del error

\n
<?php\necho "¡Hola!";\nheader('Location: /dashboard.php'); // ERROR: las cabeceras ya se enviaron\n?>
\n\n

Cómo solucionarlo

\n
    \n
  • Regla #1: llama a header() antes de cualquier salida, incluidos espacios y HTML
  • \n
  • Regla #2: asegúrate de que tu archivo PHP no tenga espacios o líneas en blanco antes de <?php o después de ?>
  • \n
  • Regla #3: usa el buffer de salida si no puedes evitar una salida temprana
  • \n
\n\n
<?php\n// Correcto: redirección antes de cualquier salida\nheader('Location: /dashboard.php');\nexit;\n?>
\n\n

Buffer de salida (método avanzado):

\n
<?php\nob_start(); // Activamos el buffer\necho "Contenido temporal";\nheader('Location: /dashboard.php');\nob_end_flush(); // Enviamos todo junto\nexit;\n?>
\n\n

Error #2: Olvidar el exit (o die) después de la redirección

\n\n

El problema

\n

Llamar a header('Location: ...') no detiene automáticamente la ejecución del script. PHP sigue procesando el código, mientras el navegador, al recibir la cabecera, comienza a cargar la nueva página. Pero ¿qué pasa si después de la redirección hay código pesado o, peor aún, código que modifica datos en la base de datos?

\n\n

Ejemplo del error

\n
<?php\nheader('Location: /exito.php');\n// ¡El usuario ya fue redirigido, pero PHP sigue trabajando!\nactualizar_saldo_usuario($userId, -1000); // PELIGRO: descuento de fondos\nenviar_email_admin("El usuario realizó una compra");\n?>
\n\n

Cómo solucionarlo

\n

Siempre usa exit (o die) justo después de llamar a header(). Esto garantiza que el script termine y no se ejecute ningún código adicional.

\n\n
<?php\nheader('Location: /exito.php');\nexit; // Detenemos el script por completo\n// El código siguiente ya no se ejecutará\nactualizar_saldo_usuario($userId, -1000);\n?>
\n\n

Error #3: URL incorrecta (rutas relativas vs absolutas)

\n\n

El problema

\n

El estándar HTTP exige que el valor de la cabecera Location sea

Blogs

Book Recommendations