Cache HTTP

Cache

Pour cacher, il est important de spécifier au moins les headers suivants :

  • Expires ou Cache-Control: max-age. Ceci permet au navigateur de connaître l’instant auquel il doit effectuer une requête au serveur.
  • Last-Modified ou Etag. Permet d’effectuer une requête conditionnelle.

 Header Etag

L’Etag est un identifiant assigné par le serveur à une ressource. La norme HTTP 1.1 ne définit pas comment le construire mais il est généralement calculé grâce à une fonction de hashage. Il représente en fait un checksum de la ressource. Si la ressource change alors l’ETAG sera différent.

L’Etag en lui même ne véhicule aucune information permettant au client (user agent) de déterminer s’il doit effectuer une nouvelle requête pour obtenir une nouvelle version de la ressource. Avec l’Etag comme seule information, le client effectuera dans tous les cas une requête vers le serveur. Le serveur confrontera l’Etag de la requête avec celui de a ressource pour renvoyer un code de retour 200 ou 304 (Etag identique). Pour empêcher le navigateur d’effectuer une requête à chaque demande il faut positionner le header Expires ou Cache-Control: max-age.

 Calcul de l’Etag

Bien que la spécification HTTP 1.1 n’indique en rien la manière de générer l’Etag, les serveurs utilisent généralement une fonction de hashage. La valeur hashée peut être :

  • le contenu de la ressource
  • la date de modification
  • un nombre de révision

Exemple d’implémentation :

  • Filtre de servlet calculant l’Etag sur le contenu de la réponse
  • FileETag directive d’apache pour les fichiers statiques

 Header Last-Modified

Date de dernière modification de la ressource renvoyée par le serveur. Utilisé pour les ressources statiques.

Etag ou Last-Modified ?

Les ressources statiques peuvent donc se voir affecter un Etag et/ou un header Last-Modified tandis que les ressources dynamiques se veront plus généralement affecter un Etag. En effet, de par sa nature, l’Etag peut être utilisé pour les ressources statiques et dynamiques (hash du contenu ou hash d’un attribut du fichier). La date de modification est plus difficile à calculer pour une page dynanique (ensemble de requêtes SQL et de HTML) que pour un simple fichier (attribut mtime). C’est pour cela que les ressources dynamiques portent principalement des Etag et que les ressources statiques portent le header Last-Modified.

Code de retour 304

La réponse 304 signifie que la copie de la ressource que dispose le client n’a pas été modifié depuis sa dernière demande. Le navigateur réutilise alors sa version de la ressource. Cela permet de ne pas renvoyer le contenu de la ressource ce qui minimise minimise le temps d’affichage.

Requête conditionnelle

Lorsque le cache de la ressource est expiré, le navigateur envoie une requête conditionnelle. La requête dispose des headers suivants :

  • If-Modified-Since : contient la date de dernière modification de la ressource locale
  • If-None-Match : etag de la copie locale

Une fois que le serveur a reçu la requête, il détermine si la ressource est périmée. Si c’est le cas, le contenu de la ressource est renvoyé au client avec un code HTTP 200. Le navigateur utilise alors le corps de la réponse et la cache à nouveau.

Header Cache-Control

Ce header est à la fois un header de requête et de réponse.

Requête

Si un navigateur envoie une requête comportant le header Cache-Control: max-age=0 (aka end-to-end revalidation) alors tous les caches entre le navigateur et le serveur revalideront la ressource. Pour cela le navigateur envoie également les headers permettant d’effectuer une requête conditionnelle (If-Modified-Since et If-None-Match). La réponse peut être un code 304.

Si le navigateur envoie une requête comportant le header Cache-Control : no-cache (aka end-to-end reload) alors le serveur ne doit pas renvoyer une copie de la ressource.

Par exemple, Firefox envoie le header « Cache-Control : max-age=0 » lors d’un F5 et le header « Cache-Control : no-cache » lors d’un ctrl+F5

Réponse

  • no-cache : Le navigateur doit revalider la ressource à chaque appel
  • max-age : Durée maximum de rétention de la ressource dans le cache navigateur. Cette directive outrepasse l’en-tête Expires
  • no-store : le cache navigateur ne doit pas stocker la ressource en local

Header Expires

Date à laquelle le cache expire. Header de la norme HTTP 1.0 renvoyé par le serveur. Sur les navigateurs modernes « cache control » prévaut.

Quand le cache a expiré le navigateur envoie une requête conditionnelle au serveur avec les headers If-Modified-Since et If-None-Match.

 

Enchainement des requêtes

diagramme sequence http requete1 Le navigateur ne connaît pas la ressource. Il effectue une requête GET pour l’obtenir. request1

2Le serveur renvoie la ressource (HTTP 200) avec des headers de cache.

  • Le header Cache-Control indique que la ressource est cachée 1h (max-age=3600)
  • Le header Expires est également positionné est indique bien que la ressource doit être considérée comme périmée dans une heure. Le header expire est redondant avec Cache-Control
  • La date de dernière modification et un Etag sont renvoyés permettant d’effectuer une requête conditionnelle à l’expiration du cache

response23Le cache local du navigateur est arrivé à expiration. Il demande au serveur si la ressource qu’il possède est toujours valide. Pour cela il effectue une requête conditionnelle.request3

4La ressource n’ayant pas été modifiée, le serveur renvoie un code HTPP 304 autorisant le navigateur à réutiliser sa copie locale. La ressource est de nouveau valide durant 1 heure. response 4

Sources

http://blogs.telerik.com/fiddler/posts/12-11-05/understanding-http-304-responses
http://en.wikipedia.org/wiki/HTTP_ETag
http://www.baeldung.com/2013/01/11/etags-for-rest-with-spring/
http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/
http://stackoverflow.com/questions/10314174/difference-between-pragma-and-cache-control-headers
http://stackoverflow.com/questions/998791/if-modified-since-vs-if-none-match
http://stackoverflow.com/questions/1046966/whats-the-difference-between-cache-control-max-age-0-and-no-cache
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Laisser un commentaire


+ 1 = deux


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>