Foros del Web » Creando para Internet » Diseño web »

Forzar al navegador a usar su caché interna.

Estas en el tema de Forzar al navegador a usar su caché interna. en el foro de Diseño web en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/08/2011, 04:50
Avatar de Negora  
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 21 años, 3 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
  #2 (permalink)  
Antiguo 02/08/2011, 10:45
Avatar de Negora  
Fecha de Ingreso: agosto-2003
Mensajes: 122
Antigüedad: 21 años, 3 meses
Puntos: 5
Respuesta: Forzar al navegador a usar su caché interna.

Bueno, bueno... Tras una infernal tarde de pruebas y más pruebas (menudo dolor de cabeza :S ), creo que ya he dado con el quid de todo esto.

Parece ser que el hecho de que muchos de estos navegadores guarden contenido en la caché tiene muchísimo que ver con el origen de la llamada que solicita dicho contenido, distinguiendo esencialmente entre la barra de direcciones o bien un documento Web. En esencia, se comporta diferente si existe un "Referrer" o no. Y claro, yo estaba haciendo todas las pruebas directamente desde esa barra, lo que me estaba proporcionando unos resultados extraños.

Tan importante es esto, que incluso Firefox, que se comporta perfectamente con el valor "Cache-Control: max-age=86400" con llamadas desde la barra, no necesita siquiera de esta cabecera para usar la caché propia cuando el contenido viene llamado desde dentro de un documento Web. Por ejemplo, desde un enlace o un iframe.

Supongo que todo esto viene por el hecho de que un usuario, cuando escribe una URL en la barra de direcciones, espera que siempre, siempre, sea una versión "fresca". Pero claro, el hecho de que ciertas cabeceras en Firefox alteren ese comportamiento, me ha creado una confusión absoluta. Pero conste que, en ese sentido, me parece que es el navegador que hace lo más adecuado, junto con IE.

Así las cosas, parece que la estrategia a seguir es controlar las cabeceras "Last-Modified" y "ETag", ya que con éstas basta para que cualquiera de los navegadores haga uso de su caché interna si existe "Referrer". En mi caso, lo que hago es publicar ambas cabeceras y además controlar si el cliente envía las cabeceras "If-Last-Modified" para "Last-Modified" y "If-None-Match" para "ETag". De ese modo puedo devolver un código de estado 304 (no modificado) si corresponde, y acelerar un poco las cosas. Y digo un poco, porque en mi caso he comprobado que lo que más tiempo consume es la llamada al servidor, pues no transfiero muchos datos y además estos van comprimidos con GZIP.

La única duda que me queda es saber si las cabeceras "Expires" o "Cache-Control: max-age=86400" influyen sobre el período de tiempo durante el que el navegador hace uso de la copia en caché antes de volver a consultar al servidor (salvo que el usuario la vacíe o refresque la página, claro está). En Firefox parece que sí que lo hacen, pero creo que quizá sea mejor no interferir en eso y dejar que cada navegador se gestione sólo en ese sentido. Total, lo más importante es que el uso de la caché se haga como mínimo mientras dure la sesión del usuario.

Etiquetas: cache, expiracion, navegador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:26.