Pour répondre à votre question sur les raisons pour lesquelles la mise en cache fonctionne, même si le serveur Web n'a pas inclus les en-têtes:
- Expire le:
[a date]
- Contrôle du cache: max-age =
[seconds]
Le serveur a gentiment demandé à tous les mandataires intermédiaires de ne pas mettre en cache le contenu (c'est-à-dire que l'élément ne doit être mis en cache que dans un cache privé , c'est-à-dire uniquement sur votre propre machine locale):
Mais le serveur a oublié d'inclure toute sorte d'indices de mise en cache:
- ils ont oublié d'inclure Expires , donc le navigateur sait utiliser la copie mise en cache jusqu'à cette date
- ils ont oublié d'inclure Max-Age , donc le navigateur sait combien de temps l'élément mis en cache est valable
- ils ont oublié d'inclure E-Tag , le navigateur peut donc faire une demande conditionnelle
Mais ils ont inclus une date de dernière modification dans la réponse:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Étant donné que le navigateur connaît la date à laquelle le fichier a été modifié, il peut effectuer une demande conditionnelle . Il demandera le fichier au serveur, mais demandera au serveur de n'envoyer le fichier que s'il a été modifié depuis le 16/10/2012 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Le serveur reçoit la demande, se rend compte que le client dispose déjà de la version la plus récente. Plutôt que d'envoyer le client 200 OK
, suivi du contenu de la page, il vous indique plutôt que votre version en cache est bonne:
304 Not Modified
Votre navigateur a dû subir le délai d'envoi d'une demande au serveur et attendre une réponse, mais cela vous a évité d'avoir à télécharger à nouveau le contenu statique.
Pourquoi Max-Age ? Pourquoi expire ?
Parce que Last-Modified est nul.
Tout sur le serveur n'a pas une date associée. Si je construis une page à la volée, aucune date n'y est associée - c'est maintenant . Mais je suis parfaitement disposé à laisser l'utilisateur mettre en cache la page d'accueil pendant 15 secondes:
200 OK
Cache-Control: max-age=15
Si l'utilisateur martèle F5, il continuera à obtenir la version mise en cache pendant 15 secondes. S'il s'agit d'un proxy d'entreprise, tous les 67198 utilisateurs qui accèdent à la même page dans la même fenêtre de 15 secondes recevront tous le même contenu, tous servis à partir d'un cache fermé. La performance gagne pour tout le monde.
L'avantage de l'ajout Cache-Control: max-age
est que le navigateur n'a même pas à effectuer de requête conditionnelle .
- si vous avez spécifié uniquement
Last-Modified
, le navigateur doit effectuer une requête If-Modified-Since
et surveiller une 304 Not Modified
réponse
- si vous l'avez spécifié
max-age
, le navigateur n'aura même pas à subir l'aller-retour du réseau; le contenu sortira directement des caches
La différence entre "Cache-Control: max-age" et "Expires"
Expires
est un ancien équivalent de l'en- Cache-Control: max-age
tête moderne (vers 1998) :
Expires
: vous spécifiez une date (beurk)
max-age
: vous spécifiez les secondes (bonté)
Et si les deux sont spécifiés, le navigateur utilise max-age
:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
Tout site Web écrit après 1998 ne devrait plus utiliser Expires
et utiliser à la place max-age
.
Qu'est-ce que ETag?
ETag est similaire à Last-Modified , sauf qu'il n'est pas nécessaire que ce soit une date - il faut juste que ce soit quelque chose .
Si je tire une liste de produits d'une base de données, le serveur peut envoyer le dernier rowversion
sous forme d'ETag, plutôt que de date:
200 OK
ETag: "247986"
Mon ETag peut être le hachage SHA1 d'une ressource statique (par exemple, image, js, css, police), ou de la page rendue en cache (c'est-à-dire ce que fait le wiki Mozilla MDN; ils hachent le balisage final):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Et exactement comme dans le cas d'une requête conditionnelle basée sur Last-Modified :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
Je peux effectuer une demande conditionnelle basée sur l'ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETag
est supérieur à Last-Modified
parce qu'il fonctionne pour des choses autres que des fichiers ou des choses qui ont une notion de date . Juste est