Apuntes sobre caché en el protocolo http

Con frecuencia borramos la caché del navegador para forzar el refresco de algún cambio en la página, pero pocas veces nos preocupamos de como se gestiona esa caché en las peticiones HTTP.

El objetivo de almacenamiento en caché (copias del contenido) en HTTP es reducir el envio de  peticiones  y, en otros caso, para eliminar la necesidad de enviar respuestas completas. Normalemte para consumir recursos web usamos el navegador, pero es aplicable a cualquier otro programa (cliente)

 

1- Preguntando al servidor si los datos han cambiado.

Para ello se utilizan las cabeceras Etag y los modificadores If-None-Match, If-Modified-Since y Last-Modified.

Etag es un identificador único que cambia cada vez que lo hace eñl contenido. De ese modo con la cabecera   If-None-Match podemos solicitar una respuesta sólo si el etag ha cambiado:

If-None-Match : W/»686897696a7c876b7e»

  • Si el contenido ha cambiado, el servidor responderá con un estado 200 , la nueva cabecera Etag y el contenido.
  • En caso de que el contenido sea el mismo, el estatus será 304 y no se enviará contenido. De este modo el cliente sabe que debe utilizar el contenido en caché.

También podemos realizar peticiones para el contenido modficado a partir de una fecha concreta con la cabecera If-Modified-Since:

If-Modified-Since: Mon, 13 Mar 2006 17:36:53 +0000
  • En caso que el contenido haya sido modificado, el servidor responderá con un estatus 200 e incluirá, además del contenido, la cabecera Last-Modified con la nueva fecha de modificación.
  • En cambio si en contenido no ha variado el estatus de la respuesta será 304.

No todos los servidores utilizan correctamente todas las cabeceras, así que es conveniente usar simúltaneamente Etag/If-None-Match y If-Modified-Since / Last-Modified

 

2- Dando validez a los datos un mínimo de tiempo.

Las cabeceras anteriores no nos evitan tener que hacer ak menos una petición para comprobar si el contenido ha sido actualizado. En los casos en que existe una probabilidad alta que el contenido no varie en un tiempo dado, podemos forzar al navegador a usar la caché durante ese tiempo con las cabeceras Cache-Control y Expires.

Ambas señalan el tiempo en que el conetnido es válido.  La cabecera más importante y versátil es la cabecera Cache-Control, que en realidad permite establecer muchas opciones relacionadas con la caché.  Mientras que Expires se usa por compatibilidad  con HTTP 1.0.

Cache-Control: private, max-age=3600, must-revalidate

Opciones de Cache-Control:

  • max-age= [segundos] – especifica la cantidad máxima de tiempo que el contenido  se considerará válido. Es similar a Expires, pero es relativa al momento de la solicitud, en lugar de absoluta.
  • s-maxage= [segundos] – similar a max-age , excepto que sólo se aplica a cachés compartidos (ej. proxies).
  • public – indica que la respuesta de una petición es cacheable, por todo tipo de sistemas de cache (compartidos y no).
  • private indica que toda o parte de la respuesta es exclusiva para un solo usuario y no se debe guardar en una caché compartida.
  • no-cacheEsta directiva confunde. Según el protocolo, indica al cliente que debe validar que el contenido no ha cambiado antes de usar la caché. Sin embargo algunos navegadores la han implementado para no guardar el contenido en caché.
  • no-storeEsta es la más segura de las directivas de control de caché. Se le indica al navegador, no sólo que no guarde la caché del contenido, sino que no almacene ningún registro del mismo. Esta es la directiva que debería usarse para contenido sensible. Últimamente los navegadores tienden a usar las directivas no-cache y no-store de forma muy similar. Lo seguro es usarlas conjuntamente.
  • must-revalidate – Indica si se puede usar un contenido una vez ha caducado.
  • proxy-revalidate – similar a la must-revalidate , excepto que sólo se aplica a las memorias caché del proxy.

 

Ejemplo de respuesta de una petición :

HTTP/1.1 304 Not Modified
Date: Tue, 27 Dec 2012 05:25:19 GMT
Expires: Tue, 27 Dec 2012 11:25:19 GMT
ETag: W/»686897696a7c876b7e»
Cache-Control: max-age=21600

 

Links Relacionados:

Cabeceras HTTP

Posted in php