Pourquoi ne Navigateur envoie toujours demande pour cache-control public avec max-age?
J'ai objets Amazon S3, et pour chaque objet, j'ai mis
Cache-Control: public, max-age=3600000
Qui est approximativement 41 jours.
Et j'ai de Distribution Amazon CloudFront ensemble avec un Minimum TTL aussi avec 3600000.
C'est la première demande après effacement de la mémoire cache.
GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Et la Réponse est
HTTP/1.1 200 OK
Content-Type: application/x-javascript
Content-Length: 226802
Connection: keep-alive
Date: Wed, 28 Aug 2013 10:37:38 GMT
Cache-Control: public, max-age=3600000
Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT
ETag: "124752e0d85461a16e76fbdef2e84fb9"
Accept-Ranges: bytes
Server: AmazonS3
Age: 342557
Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront)
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw==
Alors même que Amazon envoie clairement Cache-Control, Chrome encore fait un deuxième demande au lieu de la lire à partir du Cache.
GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "124752e0d85461a16e76fbdef2e84fb9"
If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT
Question:
Pourquoi chrome deuxième demande?
Expire
Ce comportement change quand je mets explicite de l'Expiration de l'attribut dans les en-têtes. Le navigateur ne sera pas envoyer de demande subséquente de l'en-tête Expires, mais pour le cache-contrôle public, de l'envoyer. Tous mes objets S3 ne changera jamais, ils sont immuables, lors du changement de fichier, nous les mettons en tant que nouvel objet avec la nouvelle URL.
De La Page De Référence De Script
Chrome fait les demandes suivantes seulement parfois, j'ai fait ce test en tapant l'URL dans le navigateur. Lorsque le script est référencé par page HTML, pour quelques demandes subséquentes chrome charges de mise en cache des scripts, mais une fois de plus, après un certain temps, une fois qu'il envoie une requête au serveur. Il n'y a pas de problème de Taille de Disque ici, Chrome dispose de suffisamment d'espace de cache.
Problème est que nous facturé pour chaque demande, et je veux S3 objets mis en cache pour toujours, et doivent être chargés à partir du Cache et ne doit jamais se connecter à un serveur en arrière.
Vous devez vous connecter pour publier un commentaire.
Si la Réponse HTTP contient le etag entrée, la demande conditionnelle sera toujours. ETag est un cache validateur tag. Le client sera toujours envoyer l'etag sur le serveur pour voir si l'élément a été modifié.
max-age
a été ignorée.Lorsque vous appuyez sur la touche F5 dans Chrome, il toujours envoyer des requêtes au serveur. Ceux-ci seront mis à la
Cache-Control:max-age=0
en-tête. Le serveur sera généralement répondre avec un 304 (Non Modifié) le code d'état.Lorsque vous appuyez sur la touche Ctrl+F5 ou Maj+F5, les mêmes demandes sont effectuées, mais avec le
Cache-Control:no-cache
en-tête, ce qui oblige le serveur à envoyer un cache version, généralement avec un 200 (OK) code d'état.Si vous voulez vous assurer que vous êtes en utilisant le cache du navigateur local, appuyez simplement sur Entrée dans la barre d'adresse.
F5
etEnter
faire des demandes différentes.fetch
pour vérifier si il est vraiment à partir du disque ex:fetch('YOUR_URL')
Expires
en-tête.Shift+F5
, il ya aussi pas deif-none-match
en-tête de la demande.Si Chrome Developer Tools sont ouvertes (F12), Chrome généralement désactive la mise en cache.
Il est contrôlable dans les Outils de développement les paramètres - l'icône d'Engrenage à droite de la dev-tools barre du haut.
Si vous frappez le bouton actualiser pour le chargement de la page ou de la ressource, la
if-modified-since
en-tête de demande est envoyée à chaque fois, si vous au lieu la demande de la page/ressource comme une demande distincte dans un nouvel onglet ou via un lien dans un script ou une page html, il va charger la page de ressources de la mémoire cache du navigateur lui-même.C'est ce qui s'est passé dans mon cas, peut-être que c'est le général universelle de cas. Je ne suis pas complètement sûr, mais c'est ce que j'ai recueillies par le biais de mon creuser.