HOWTO · PHP

Redirigir en PHP

Este tutorial demuestra cómo redirigir a un usuario de una página a una página diferente en PHP

En esta página

Para redirigir una solicitud en PHP, envía una cabecera de respuesta Location con header() antes de que el script genere HTML u otro contenido y, después, detén el script. El ejemplo siguiente lleva el navegador a una URL de destino. Coloca el archivo PHP en un servidor web local y ábrelo en un navegador para ver la navegación.

Redirigir a una URL con la función header() de PHP

La función header() envía una cabecera de respuesta HTTP. Para una redirección, el campo de cabecera es Location y su valor es la URL de destino. PHP debe enviar esta cabecera antes de cualquier contenido del cuerpo de la respuesta, incluidos los espacios en blanco que estén fuera de las etiquetas PHP. Coloca el código de redirección al principio del controlador de la solicitud, antes de las plantillas o de cualquier salida de la página.

Este ejemplo independiente utiliza una variable para la URL de destino. La llamada a exit termina la solicitud actual después de preparar la respuesta, de modo que el resto de la página no continúa como si la redirección no hubiera ocurrido. La comprobación de ejecución suministrada ejecutó correctamente este ejemplo y no produjo salida estándar; la redirección se envía en la respuesta HTTP, no se imprime como texto. Al abrir el archivo PHP mediante el servidor web local, el navegador debería ir al destino del ejemplo.

<?php
$url = 'https://example.com/';
header('Location: ' . $url);
exit;
?>

Usa una URL a la que tu aplicación tenga permitido enviar a los usuarios. Si el destino procede de datos de la solicitud, valídalo con una lista de permitidos o constrúyelo a partir de rutas de confianza de la aplicación; pasar datos arbitrarios del usuario a una redirección puede enviar a los visitantes a un sitio no deseado. Para una ruta dentro de la misma aplicación, suele bastar con una ruta como /account/.

Crear una función auxiliar de redirección en PHP con un código de estado HTTP

Una función reutilizable redirect puede recibir tanto el destino como el estado de la respuesta. El tercer argumento de header() es el código de estado; el segundo controla si una cabecera con el mismo nombre reemplaza a otra anterior. La función auxiliar siguiente usa 302 de forma predeterminada, un código habitual para una redirección temporal, y acepta otro estado cuando la ruta lo requiere.

<?php
function redirect(string $url, int $statusCode = 302): void
{
    header('Location: ' . $url, true, $statusCode);
    exit;
}

redirect('https://example.com/', 301);
?>

El ejemplo pasa 301 para indicar que el destino es permanente. Usa ese estado solo cuando el cambio vaya a mantenerse; los navegadores y otros clientes pueden recordar las redirecciones permanentes. 302 indica una redirección temporal y es una opción predeterminada más adecuada cuando el destino puede cambiar. El manual de PHP sobre header() documenta los parámetros de la función, y la referencia de MDN sobre 301 describe el estado permanente.

La comprobación de ejecución suministrada ejecutó correctamente este ejemplo de la función auxiliar y no produjo salida estándar; el estado de redirección y la cabecera Location forman parte de la respuesta HTTP, no se imprimen como texto. Ejecuta el archivo PHP mediante un servidor web local para observar la navegación del navegador. La función termina la solicitud después de establecer la cabecera de respuesta. En una aplicación real, valida la URL antes de llamar a la función auxiliar y elige un estado que corresponda a un cambio temporal o permanente. La cabecera Location y el estado forman parte de la respuesta HTTP, por lo que este método funciona antes de que el navegador reciba el cuerpo de la página.

Usar JavaScript como alternativa de redirección en el cliente

Cuando no sea posible hacer una redirección en el servidor, una página puede pedir al navegador que navegue mediante window.location. Esta es una navegación del lado del cliente: PHP envía el contenido de la página y el navegador ejecuta el script. No es almacenamiento en búfer de salida de PHP ni convierte la respuesta HTTP en una redirección del servidor. Además, requiere que JavaScript esté habilitado; por eso, usa el método de PHP header() cuando el servidor pueda decidir el destino antes de enviar la página.

El siguiente fragmento para una página del navegador muestra esta alternativa. Añádelo a una página que el servidor web local pueda servir y, después, ábrela en un navegador con JavaScript habilitado para ver cómo navega al destino. El fragmento se presenta como código fuente para el navegador y no se ha ejecutado para este artículo.

<script>
  window.location = "https://example.com/";
</script>

Como este código se ejecuta en el navegador, no puede enviar un estado de redirección HTTP como 301 en la respuesta que el navegador ya recibió. Mantén fijo el destino o valida cualquier valor que uses para construirlo, igual que harías con una redirección del servidor. Usa esta alternativa solo cuando la navegación del lado del cliente sea adecuada para la página; los visitantes que tengan JavaScript deshabilitado permanecerán en la página original.