web-dev-qa-db-fra.com

Qu'est-ce que Cache-Control: private?

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".

138
user782220

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:

  • Expire: [a date]
  • Cache-Control: max-age = [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):

  • Cache-Control: privé

Mais le serveur a oublié d'inclure toute sorte d'indices de mise en cache:

  • ils ont oublié d'inclure Expires , afin que le navigateur sache utiliser la copie en cache jusqu'à cette date
  • ils ont oublié d'inclure Max-Age , afin que le navigateur sache combien de temps l'élément mis en cache est bon pour
  • ils ont oublié d'inclure E-Tag , afin que le navigateur puisse faire une demande conditionnelle

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.

Pourquoi Max-Age ? Pourquoi expire ?

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 .

  • si vous avez uniquement spécifié Last-Modified, le navigateur doit exécuter une requête If-Modified-Since et rechercher une réponse 304 Not Modified.
  • si vous avez spécifié max-age, le navigateur n'aura même pas à subir les allers-retours du réseau. le contenu sortira des caches

La différence entre "Cache-Control: max-age" et "Expires"

Expires 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.

Qu'est-ce que ETag?

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

52
Ian Boyd
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.

De section RFC2616 14.9.1

163
Dan D.

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.

20
Paul Draper

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.

0
Lin.Yang