redireccionar - ¿Se ejecutará siempre el código después del encabezado de redirección en PHP?
redireccionar javascript onclick (5)
El HTML después de su línea de Ubicación no se ejecuta dentro de PHP; se ejecutaría en el navegador. Depende del navegador si ejecuta o no el Javascript que ha incluido en esa página; PHP no tiene nada que ver con eso.
Para mí, los documentos de PHP implican que cualquier PHP debajo del header()
cuando envíe un redireccionamiento continuará ejecutándose. Pero se ''ejecuta'' en el intérprete de PHP, volcando JS al navegador. No hay relación entre lo que dice en los documentos de PHP y si el navegador ejecuta JS o no.
Entonces, sé que la regla general es después de hacer un redireccionamiento de encabezado en PHP, debe llamar a exit () para evitar que se ejecute código adicional, pero quiero saber si coloca código después del encabezado de redirección, si siempre se ejecutará.
Investigué varias formas de seguimiento de referencias en Google Analytics y encontré esta publicación: Consejos y trucos de Google Analytics: seguimiento de redireccionamientos 301 en Google Analytics
Recomienda hacer algo como esto:
<?
Header( “HTTP/1.1 301 Moved Permanently” );
Header( “Location: http://www.new-url.com” );
?>
<script type=”text/javascript”>
var gaJsHost = ((“https:” == document.location.protocol) ? “https://ssl.” : “http://www.”);
document.write(unescape(“%3Cscript src=’” + gaJsHost + “google-analytics.com/ga.js’ type=’text/javascript’%3E%3C/script%3E”));
</script>
<script type=”text/javascript”>
try {
var pageTracker = _gat._getTracker(“UA-YOURPROFILE-ID”);
pageTracker._trackPageview();
} catch(err) {}</script>
Por la forma en que siempre he entendido la función header (), depende del navegador y puede ejecutar el redireccionamiento siempre que lo desee. Por lo tanto, no hay garantía de que el JavaScript comience o termine de ejecutarse antes de que se produzca la redirección.
La documentación de PHP para la función de encabezado () indica que el motivo para salir después de una redirección es "asegurarse de que el código siguiente no se ejecute cuando lo redirigamos". Eso no suena como si garantizaran que todo el siguiente código se ejecutará, solo que podría suceder.
A pesar de eso, encontré una forma diferente de administrar realmente el seguimiento, pero quería ver si podía averiguar cómo funcionaba exactamente header () en esta situación ...
Gracias por tu ayuda.
Es una condición de carrera. Una vez que el encabezado de redirección se envía al navegador, el navegador cerrará la conexión actual y abrirá una nueva para la URL de redireccionamiento. Hasta que la conexión original se cierre y Apache apague la secuencia de comandos, su código continuará ejecutándose como antes.
En teoría, si hubiera una conexión lo suficientemente rápida entre el cliente / servidor y no hubiera memoria intermedia en ninguna parte de la canalización, emitir el encabezado provocaría que la secuencia de comandos finalizara de inmediato. En realidad, puede estar en cualquier lugar entre "ahora" y "nunca" para que se inicie el apagado.
Usar la función de encabezado en PHP solo agrega a los encabezados de la respuesta devuelta por el servidor. No envía datos inmediatamente y no finaliza inmediatamente la conexión. Cualquier código después de la llamada del header
se ejecutará.
En particular, es una buena idea agregar un cuerpo de respuesta incluso después de hacer un redireccionamiento 301 para que los clientes que no admiten el redireccionamiento también obtengan una respuesta descriptiva. De hecho, de acuerdo con la especificación HTTP 1.1 Sección 10.3.2 -
A menos que el método de solicitud fuera HEAD, la entidad de la respuesta DEBERÍA contener una breve nota de hipertexto con un hipervínculo al nuevo URI (s). Si el código de estado 301 se recibe en respuesta a una solicitud que no sea GET o HEAD, el agente de usuario NO DEBE redirigir automáticamente la solicitud a menos que el usuario pueda confirmarla, ya que esto podría cambiar las condiciones bajo las cuales se emitió la solicitud.
EDITAR :
Bueno, como señaló Anupam Jain, parece que los navegadores no terminan la conexión sin obtener el cuerpo de respuesta y suena sensato. Así que repensé mi respuesta
Eso no parece que garanticen que se ejecutará todo el siguiente código
Es más probable que sea una advertencia en caso de que exista algún código sensible que no deba ejecutarse. Un contenido de página privada, por ejemplo. Por lo tanto, además de enviar el encabezado, también debe asegurarse de que no se haya enviado ningún contenido confidencial y la salida parece una solución bastante sólida. Por lo tanto, lo expresaría como "asegúrese de que el código sensible a continuación no se ejecute cuando lo redireccionamos".
Por lo tanto, no hay garantía de que el JavaScript comience o termine de ejecutarse antes de que se produzca la redirección.
Exactamente Parece que no tiene nada que ver con la ejecución del script, sino con la voluntad del navegador de ejecutar cualquier cosa después de obtener la respuesta 3xx. Creo que voy a probarlo, pero también puedes probarlo.
Me he dado cuenta de que el código todavía se ejecuta y que varios encabezados basados en sentencias if pueden causar un "error de bucle de redireccionamiento". Hice un hábito para ahora agregar en die("Redirecting...");
después de cada redirección de encabezado y no veo que el problema persista.