Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/08/2011, 04:50
Avatar de Negora
Negora
 
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 20 años, 8 meses
Puntos: 5
Pregunta Forzar al navegador a usar su caché interna.

Hola:

Como sabéis, muchos navegadores cuentan con su propia memoria caché para que, siempre que sea posible y bajo ciertas condiciones, tomen el archivo directamente de ahí y no necesiten siquiera realizar petición alguna al servidor (durante un período de caducidad limitado para ese contenido, por supuesto).

Pues bien, llevo ya algún tiempo tratando de buscar una manera de poder forzar, desde servidor, que el navegador siga ese comportamiento con determinado contenido dinámico que, por su nula frecuencia de actualización, me interesa que se cargue desde dicha memoria. Me interesa que el contenido expire como mínimo tras 1 día.

Como es evidente, la única manera de lograr algo semejante (al menos que yo conozca), es recurrir a las cabeceras HTTP/1.x y cruzar los dedos para que los navegadores las interpreten correctamente. Experimentando un poco he logrado avances significativos, alcanzado un conjunto de cabeceras que más o menos han servido bien en muchos navegadores:

Código:
Cache-Control: public; max-age=86400
Pragma: public; max-age=86400
Date: <fecha_actual>
Expires: <fecha_actual + 1 día>
Last-Modified: <fecha_actual - 1 día>
Esto en Firefox va como la seda. De hecho le basta con que use el valor "max-age" en la cabecera "Cache-Control". Usando FireBug se puede ver cómo las peticiones posteriores aparecen con respuesta HTTP 200, pero atenuadas en color gris, lo que indica que no es tráfico de red, sino de su caché.

En Opera ha costado un poco más. Si no le indicas una fecha de referencia con "Date", ignora el resto de cabeceras relacionadas. En su herramienta Dragonfly se ve perfectamente como las peticiones siguientes ya no indican tiempo de petición si no un simple "n/a".

En Internet Explorer lo he probado y en su herramienta de desarrollador curiosamente parece que hace una petición al servidor y que éste le responde con código 304 (no modificado). Sin embargo, hay 2 detalles que me hacen pensar que sí que toma el contenido de su caché sin siquiera preguntar al servidor. Por un lado aparece atenuada la entrada correspondiente (como en FireBug; no sé si en IE significa lo mismo). Y por otro, la prueba más clara, es que la petición le lleva mucho menos de 1 ms. (o eso dice él), lo cual es imposible si fuera una petición de red.

Pero donde no he logrado avances es en Google Chrome y Safari, supongo que porque ambos usan WebKit. Probando archivos HTML, JS y CSS se ve perfectamente que sí los toma posteriormente de su caché. Pero tratando de emular algo similar para contenido dinámico no ha dado resultado alguno.

La extensión usada no tiene que ver, ya que he creado un archivo JSP con extensión .html y no ha funcionado.

Y no sé hasta qué punto influyen las cabeceras o el contenido en sí, pues he copiado tal cual ese archivo HTML dentro de un JSP, le he puesto idénticas cabeceras y nada de nada. Esto último sí que me ha dejado extrañado.

¿Sabe alguien alguna manera de lograr algo similar en estos 2 últimos navegadores?

Muchas gracias.

Última edición por Negora; 02/08/2011 a las 04:57