¿Por qué tengo que llamar a 'salir' después de la redirección a través del encabezado ('Ubicación...') en PHP?

Resuelto Nicolò Martini asked hace 54 años • 6 respuestas

Ya sabes que si quieres redirigir a un usuario en PHP puedes usar la función de encabezado:

header('Location: http://smowhere.com');

También es bien sabido que es una buena práctica poner también un exit;después de la headerllamada, para evitar la ejecución de otro código php. Entonces mi pregunta es: ¿podría ejecutarse efectivamente el código después de la llamada a la ubicación del encabezado? ¿En qué casos? ¿ Puede un usuario malintencionado ignorar completamente la header('Location..')llamada? ¿Cómo?

Nicolò Martini avatar Jan 01 '70 08:01 Nicolò Martini
Aceptado

¿Podría ejecutarse efectivamente el código después de la llamada a la ubicación del encabezado?

Sí, siempre. Es headersolo una línea de datos que le pide al navegador que redirija. El resto de la página seguirá siendo servido por PHP y el cliente podrá verla simplemente impidiendo headerque se ejecute el comando.

Esto es bastante fácil de hacer con un cliente de línea de comandos como wget, por ejemplo, simplemente diciéndole que no siga las redirecciones.

En pocas palabras: si no lo evita, PHP enviará el cuerpo completo incluso después de una headerllamada. Ese cuerpo está totalmente disponible para el destinatario sin ninguna habilidad especial de piratería.

Pekka avatar Apr 30 '2010 21:04 Pekka

Si redirige pero no lo hace die(), exit() el código siempre se ejecuta y se muestra .

Tomemos el siguiente ejemplo:

administrador.php:

if (authenticationFails)
{
    // redirect and don't die
}

// show admin stuff

Si no se asegura de finalizar la ejecución después del encabezado de ubicación, todos los usuarios obtendrán acceso.

Alix Axel avatar Apr 30 '2010 21:04 Alix Axel

header()indica a PHP que se debe enviar un encabezado HTTP... Cuando se envían los encabezados HTTP.

Y esos no se envían inmediatamente cuando escribes la llamada al encabezado(), sino cuando llega el momento de enviarlos (normalmente, cuando PHP necesita comenzar a enviar el cuerpo de la respuesta, lo que puede ser más tarde de lo que piensas, cuando output_bufferingestá habilitado ) .

Por lo tanto, si simplemente llama a header(), no hay absolutamente ninguna garantía de que el código escrito después de esta declaración no se ejecute, a menos que indique que no debe hacerlo mediante el uso de exit/ die.

El usuario puede ignorar el Locationencabezado si lo desea; pero no cambiará nada por el hecho de que el código después de la llamada de header()podría o no ejecutarse: ese asunto es del lado del servidor.

Pascal MARTIN avatar Apr 30 '2010 21:04 Pascal MARTIN

Se ejecutará el código PHP después de un encabezado(). A veces, sin embargo, esto es necesario, como muestra el ejemplo en php.net. Para asegurarse de que no sea así, finalice el flujo del programa por completo.

Alister Bulman avatar Apr 30 '2010 21:04 Alister Bulman