2012-01-20 15 views
17

¿Hay alguna manera de forzar la memoria caché de un cliente para volver a cargar un archivo HTML si no puede cambiar el URI que hace referencia a ese archivo (por ejemplo, no puede agregar un parámetro de marca de tiempo)?Forzar actualización de la memoria caché después de la implementación

Aquí está mi situación:

  • Un plugin desplegado a unos 1000 usuarios
  • ese plugin cargas example.com/page.html que pide a script.js
  • El URI example.com/page.html recurso no se puede cambiar (w/o actualizaciones de plugins)
  • page.html ha sido cambiado. Necesito borrar el antiguo page.html del caché de los usuarios para que pueda cargar el nuevo page.html.

¿Alguna idea? Htaccess? ¿La API de PHP que el antiguo & llama a page.html?

Gracias!

Respuesta

29

Bueno, si la página ya está en la memoria caché de un navegador, es difícil decirle que no use su versión almacenada en caché porque probablemente no se molestará en volver a verificar antes de determinar que su versión en caché está obsoleta. Simplemente tendrá que enviar una carta de correo postal a todos sus usuarios para informarles que presionen ctrl + f5 :)

Existe la posibilidad de que el navegador al menos pruebe con una solicitud HEAD para verificar la marca de tiempo modificada antes sin embargo, sirve su versión en caché. En este caso, lo siguiente te ayudará.

Los navegadores negocian su contenido desde su servidor web utilizando encabezados estándar HTTP. En el futuro, si desea decirle a un navegador que no almacene en caché un archivo, debe enviar los encabezados HTTP apropiados. Si quieres hacer esto en PHP puede utilizar la función header para enviar las cabeceras HTTP apropiadas para el navegador:

header('Cache-Control: no-cache'); 
header('Pragma: no-cache'); 

Si se tiene que hacer a través de HTML puede hacer lo siguiente en el encabezado de la página:

<meta http-equiv="Expires" content="Tue, 01 Jan 1995 12:12:12 GMT"> 
<meta http-equiv="Pragma" content="no-cache"> 

Sin embargo, no hay manera de que usted esté seguro de que el navegador respetará su solicitud de que no almacene en caché una página. Hay otras cosas como eTag y otras cosas, pero, francamente, no creo que eso te ayude si la página ya está en la memoria caché.


ACTUALIZACIÓN

De la especificación HTTP/1.1 en Response Cacheability:

Si no hay ni un validador de caché ni el tiempo una caducidad explícita asociada con una respuesta, no lo hacemos se espera que se almacene en caché, pero ciertos cachés PUEDEN violar esta expectativa (por ejemplo, cuando el es pequeño o no hay conectividad de red disponible).

+0

no estoy seguro si esto logra mi objetivo. El archivo PHP sobre el que tengo control es una API invocada por un archivo js de 'example.html'. La solución 'header' que proporcionó parece que solo funcionaría para el archivo php mismo. ¿O funcionaría para todos los recursos en el mismo dominio? En cuanto a la solución HTML, eso funciona si el antiguo archivo 'example.html' ya incluía esas etiquetas, pero como se describió anteriormente, ese no es el caso para mi situación. – Kyle

+0

De lo contrario, estoy intentando cargar un nuevo 'example.html' sobre un antiguo' example.html' que ya está en la memoria caché. – Kyle

+0

Lamentablemente, una vez que el navegador ha almacenado algo en caché, no hay mucho que pueda hacer al respecto. Lo bueno es que la mayoría de los navegadores no guardan en la memoria caché durante mucho tiempo. Solo los hechos de la vida, me temo. – rdlowrey

4

Quizás PHP podría usarse para agregar una marca de tiempo a la llamada javascript. Podrías ejecutar esto por la duración ...........Por ejemplo:

check_if_cache_should_be_disabled.php

<?php 
$deployment_flag = true; // Uncomment this if you want to disable normal cache. 
//$deployment_flag = false // Uncomment this if you want to enable normal cache. 
?> 

page.php

<script src="/js/script.js<?php 
require('check_if_cache_should_be_disabled.php'); 
// File Get Contents can be used for a remote server 
//file_get_contents('http://yourserver.com/check_if_cache_should_be_disabled.php'); 
if ($deployment_flag == true) { 
print ('?ts='.date()); 
} 
?>"></script> 
0

Se puede cambiar el nombre del archivo, por ejemplo page_v2.html lo que hará que el servidor cargue la página como una página nueva.

Cuestiones relacionadas