web-dev-qa-db-fra.com

Pourquoi le navigateur envoie-t-il toujours une demande de contrôle de cache public avec max-age?

J'ai des objets Amazon S3 et, pour chaque objet, j'ai défini

Cache-Control: public, max-age=3600000

C'est approximativement 41 jours.

De plus, Amazon CloudFront Distribution est défini avec Minimum TTL également avec 3600000.

C'est la première demande après avoir effacé le 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==

Même si Amazon envoie clairement Cache-Control, Chrome continue à faire une 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 fait-il une deuxième demande? 

Expires Ce comportement change lorsque je mets un attribut Expires explicite dans les en-têtes. Le navigateur n'enverra pas la requête suivante pour l'en-tête Expires, mais pour le contrôle de cache public, il l'enverra. Tous mes objets S3 ne changeront jamais, ils sont immuables, lorsque nous changeons de fichier, nous les mettons comme nouvel objet avec une nouvelle URL.

Dans les références de script de page Chrome ne fait parfois que les requêtes suivantes, j’ai fait ce test en tapant réellement une URL dans le navigateur. Lorsqu'un script est référencé par une page HTML, Chrome charge les scripts mis en cache pour les requêtes suivantes, mais une fois de plus, il envoie une requête au serveur. Il n'y a aucun problème de taille de disque ici, Chrome dispose de suffisamment d'espace de cache.

Le problème est que nous sommes facturés pour chaque demande et que je veux que les objets S3 soient mis en cache indéfiniment. Ils doivent être chargés à partir du cache et ne doivent jamais se connecter au serveur.

34
Akash Kava

Si la réponse HTTP contient l'entrée etag, la demande conditionnelle sera toujours faite. ETag est une balise de validation du cache. Le client enverra toujours l'etag au serveur pour voir si l'élément a été modifié.

18
woolagaroo

Когда вы нажимаетеF5dans Chrome sur corrigé отправляет запросы на сервер. Vous êtes le (s) seul (e) Cache-Control:max-age=0. Сервер обычно отвечает кодом состояния 304 (не изменен).

Когда вы нажимаетеCtrl+F5или жеShift+F5выполняются те же запросы, но с заголовком Cache-Control:no-cache, что вынуждает сервер отправлять некэшированную версию, обычно с кодом состояния 200 (ОК).

À propos de nousEnterв адресной строке.

37
Der Hochstapler

Si les outils de développement Chrome sont ouverts (F12), Chrome désactive généralement la mise en cache.

Il est contrôlable dans les paramètres des outils de développement - l’icône Engrenage à droite de la barre supérieure de dev-tools.

9
user3841754

Si vous cliquez sur le bouton d'actualisation pour charger la page ou la ressource particulière, la demande d'en-tête if-modified-since est envoyée à chaque fois. Si vous demandez plutôt la page/ressource séparément, dans un nouvel onglet ou via un lien dans un script ou une page html il chargera la page/ressource à partir du cache du navigateur lui-même.

C'est ce qui s'est passé dans mon cas, peut-être que c'est le cas universel universel. Je ne suis pas tout à fait sûr, mais c'est ce que j'ai recueilli lors de mes recherches.

0
Anirban Roy Das