Quand je visite chesseng.herokuapp.com Je reçois un en-tête de réponse qui ressemble à
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
puis je rafraîchit la page et reçois
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
il semble donc que la mise en cache fonctionne. Si cela fonctionne pour la mise en cache, alors quel est le point de Expire et Cache-Control: max-age . Pour ajouter à la confusion, lorsque je teste la page à partir de https://developers.google.com/speed/pagespeed/insights/ , il me dit de "Tirer parti de la mise en cache du navigateur".
Pour répondre à votre question sur les raisons pour lesquelles la mise en cache fonctionne, même si le serveur Web n'incluait pas les en-têtes:
[a date]
[seconds]
Le serveur a gentiment demandé à tous les mandataires intermédiaires de ne pas mettre le contenu en cache (c’est-à-dire que l’élément ne devrait être mis en cache que dans un cache private, c’est-à-dire uniquement sur votre propre ordinateur local):
Mais le serveur a oublié d'inclure toute sorte d'indices de mise en cache:
Mais ils ont inclus une date Dernière modification dans la réponse:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Comme 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 lui demandera de n'envoyer le fichier que s'il a été modifié depuis le 16/10/2012 à 15h13: 38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Le serveur reçoit la demande et réalise que le client possède déjà 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 correcte:
304 Not Modified
Votre navigateur a dû subir le retard de l'envoi d'une demande au serveur et a attendu une réponse, mais cela évitait de devoir télécharger à nouveau le contenu statique.
Parce que Last-Modified est nul.
Tout ce qui se trouve sur le serveur n'est pas associé à une date . Si je construis une page à la volée, aucune date ne lui est associée - elle est maintenant . Mais je suis tout à fait 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, ils continueront à obtenir la version en cache pendant 15 secondes. S'il s'agit d'un proxy d'entreprise, tous les 67198 utilisateurs accédant à la même page dans la même fenêtre de 15 secondes obtiendront tous le même contenu, tous servis à partir d'un cache fermé. Performance gagner pour tout le monde.
L'ajout de Cache-Control: max-age
présente l'avantage de ne pas même obliger le navigateur à exécuter une demande conditionnelle .
Last-Modified
, le navigateur doit exécuter une requête If-Modified-Since
et rechercher une réponse 304 Not Modified
.max-age
, le navigateur n'aura même pas à subir les allers-retours du réseau. le contenu sortira des cachesExpires
est un équivalent hérité de l'en-tête moderne (c. 1998) Cache-Control: max-age
:
Expires
: vous spécifiez une date (beurk)max-age
: vous spécifiez des 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
, mais plutôt max-age
.
ETag est similaire à Last-Modified , sauf que ce n'est pas le cas. doit être une date - il doit juste être un quelque chose.
Si je retire une liste de produits d'une base de données, le serveur peut envoyer le dernier rowversion
sous la forme d'un ETag, plutôt que d'une 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 de 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
Un ETag
est supérieur à Last-Modified
parce qu'il fonctionne pour des choses autres que fichiers, ou pour des choses comportant une notion de date. C'est juste est
Cache-Control: private
Indique que tout ou partie du message de réponse est destiné à un seul utilisateur et NE DOIT PAS être mis en cache par un cache partagé, tel qu'un serveur proxy.
RFC 2616, section 14.9.1 :
Indique que tout ou partie du message de réponse est destiné à un seul utilisateur et NE DOIT PAS être mis en cache par un cache partagé ... Un cache privé (non partagé) PEUT mettre en cache la réponse.
Les navigateurs pourraient utiliser cette information. Bien sûr, "utilisateur" actuel peut signifier beaucoup de choses: utilisateur du système d'exploitation, utilisateur du navigateur (profils de Chrome, par exemple), etc. Ce n'est pas spécifié.
Pour moi, un exemple plus concret de Cache-Control: private
est que les serveurs proxy (qui ont généralement de nombreux utilisateurs) ne le met pas en cache. Il est destiné à l'utilisateur final et à personne d'autre.
Pour votre information, la RFC précise que cela ne fournit pas de sécurité. Il s'agit de montrer le bon contenu, pas de sécuriser le contenu.
Cette utilisation du mot privé Word ne contrôle que l'emplacement où la réponse peut être mise en cache et ne peut pas garantir la confidentialité du contenu du message.
Le champ d'en-tête d'entité Expires donne la date/heure après laquelle la réponse est considérée comme périmée. Le champ Cache-control: maxage donne la valeur d'âge (en secondes) supérieure à celle de la réponse considérée comme périmée.
Bien que le champ d'en-tête ci-dessus donne un mécanisme au client pour décider d'envoyer ou non une requête au serveur. Dans certaines conditions, le client envoie une demande à un serveur et la valeur de la réponse est supérieure à la valeur maxage. Cela signifie-t-il que le serveur doit envoyer la ressource au client? Peut-être que la ressource n'a jamais changé.
Afin de résoudre ce problème, HTTP1.1 donne la tête modifiée en dernier. Le serveur donne la date de dernière modification de la réponse au client. Lorsque le client a besoin de cette ressource, il envoie le champ principal If-Modified-Since au serveur. Si cette date est antérieure à la date de modification de la ressource, le serveur envoie la ressource au client et en fournit 200. Sinon, le code 304 est renvoyé au client, ce qui signifie que le client peut utiliser la ressource mise en cache.