Introducción: por qué redirigir en PHP no es solo header('Location:')
\n\nCualquiera 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.
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\nEn 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\nError #1: Redirección después de mostrar contenido (Header already sent)
\n\nEl problema
\nEl 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».
¿Por qué ocurre?
\nEl 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.
Ejemplo del error
\n<?php\necho "¡Hola!";\nheader('Location: /dashboard.php'); // ERROR: las cabeceras ya se enviaron\n?>\n\nCó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
<?phpo después de?>\n - Regla #3: usa el buffer de salida si no puedes evitar una salida temprana \n
<?php\n// Correcto: redirección antes de cualquier salida\nheader('Location: /dashboard.php');\nexit;\n?>\n\nBuffer 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\nError #2: Olvidar el exit (o die) después de la redirección
\n\nEl problema
\nLlamar 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?
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\nCómo solucionarlo
\nSiempre 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.
<?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\nError #3: URL incorrecta (rutas relativas vs absolutas)
\n\nEl problema
\nEl estándar HTTP exige que el valor de la cabecera Location sea