Forzar el refresco de un sitio dinámico con Internet Explorer

Forzar el refresco de un sitio dinámico con Internet Explorer

Probablemente, más de uno haya tenido problemas para forzar el refresco de un contenido dinámico en Internet Explorer. Cuando se hace una petición a una misma dirección con las mismas variables GET, el navegador, al contrario que actúan el resto (como es de costumbre), suele tener muy buena memoria y muestra el contenido que tiene en caché.

Como no podemos controlar la caché de nuestros usuarios, la soluciones son varias. Personalmente he probado muchas y sinceramente me parece tan poco regular el comportamiento de Internet Explorer (sobre todo entre la versión 6, 7 y 8 ) que he optado por implementar todas en cada aplicación web que desarrollo de forma que espero asegurarme que este problema no surja.

firefox-vs-internet-explorerCrear una variable GET aleatoria

Además de pasar las variables (o no pasar ninguna variable) la primera solución que se me ocurrió fue crear una variable GET aleatoria en cada ejecución. Aunque no es agradable ver index.php?n=10 es mejor que funcione. La implementación en PHP sería la siguiente (el uso en otros lenguajes es análogo):
$aleatorio = rand(100);
header("Location:index.php?n=$aleatorio"); // enlaces de esta forma

Cabeceras HTTP para forzar el refresco

Aunque a priori parecen la solución más formal y limpia, no siempre funciona, así que es mejor también incluirlo, pero no fiarnos. Veamos como serían las cabeceras para HTTP 1.0 y HTTP 1.1, la emisión de estas cabeceras previas a cualquier otra interacción en PHP es como sigue:
header ("Cache-Control: no-cache, must-revalidate");  // HTTP 1.1
header ("Pragma: no-cache");                          // HTTP 1.0

Cabeceras HTTP para incluir fecha de última modificación y de expiración

De esta forma, poniendo una regla de modificación variable (igual a la actual) y una fecha de expiración pasada, ayudamos a obligar a que el navegador refresque.

header("Expires: Sun, 01 Mar 2009 00:00:00 GMT");    // fecha del pasado
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // fecha actual, modificándose siempre

Todas estas recetas, son válidas para cualquier otro lenguaje, ya que como podéis apreciar, son propias de HTTP pero implementadas vía PHP en este post en concreto. Espero que tengáis suerte y esperemos contar en este sitio como Internet Explorer se estandariza al nivel de sus rivales.