it-swarm.com.de

Warum sendet der Browser immer noch eine Anfrage zur Cache-Kontrolle mit max-age?

Ich habe Amazon S3-Objekte und für jedes Objekt habe ich festgelegt

Cache-Control: public, max-age=3600000

Das sind ungefähr 41 Tage.

Und ich habe Amazon CloudFront Distribution mit Minimum TTL auch mit 3600000 festgelegt.

Dies ist die erste Anforderung nach dem Löschen des 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

Und Antwort ist

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==

Auch wenn Amazon Cache-Control eindeutig sendet, stellt Chrome immer noch eine zweite Anforderung, anstatt sie aus dem Cache zu lesen.

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

Frage: Warum stellt Chrom die zweite Anfrage? 

Expires Dieses Verhalten ändert sich, wenn ich ein explizites Expires-Attribut in Headern setze. Der Browser sendet keine nachfolgende Anforderung für den Expires-Header, aber für die öffentliche Cache-Steuerung sendet er diese. Meine S3-Objekte werden sich niemals ändern, sie sind unveränderlich. Wenn wir die Datei ändern, werden sie als neues Objekt mit neuer URL eingefügt.

In Page Script Reference Chrome führt nachfolgende Anfragen nur manchmal aus. Ich habe diesen Test durchgeführt, indem ich tatsächlich die URL im Browser eingegeben habe. Wenn ein Skript von der HTML-Seite referenziert wird, lädt Chrome für einige aufeinanderfolgende Anforderungen zwischengespeicherte Skripts. Nach einiger Zeit und gelegentlich sendet es jedoch eine Anforderung an den Server. Hier gibt es kein Problem mit der Festplattengröße. Chrome verfügt über ausreichend Cache-Speicherplatz.

Das Problem ist, dass wir für jede Anfrage eine Gebühr erhalten. Ich möchte, dass S3-Objekte für immer zwischengespeichert werden und aus dem Cache geladen werden und niemals eine Verbindung zum Server herstellen.

34
Akash Kava

Wenn die HTTP-Antwort den etag-Eintrag enthält, wird immer die bedingte Anforderung gemacht. ETag ist ein Cache-Validator-Tag. Der Client sendet das etag immer an den Server, um zu sehen, ob das Element geändert wurde.

18
woolagaroo

Когда вы нажимаетеF5In Chrome de отправляет запросы на сервер. Они будут сделаны с заголовком Cache-Control:max-age=0. Сервер обычно отвечает кодом состояния 304 (не изменен).

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

Bei Auswahl dieser Option können Sie den Fehlerbehebungsfaktor ändernEnterв адресной строке.

37
Der Hochstapler

Wenn die Chrome Developer Tools geöffnet sind (F12), deaktiviert Chrome normalerweise die Zwischenspeicherung.

Es ist in den Developer Tools-Einstellungen steuerbar - das Zahnradsymbol rechts neben der oberen Leiste der Dev-Tools.

9
user3841754

Wenn Sie auf die Aktualisierungsschaltfläche klicken, um die bestimmte Seite oder Ressource zu laden, wird die if-modified-since-Header-Anforderung jedes Mal gesendet, wenn Sie stattdessen die Seite/Ressource als separate Anforderung in einer neuen Registerkarte oder über einen Link in einer Skript- oder HTML-Seite anfordern. Die Seite/Ressource wird aus dem Browser-Cache selbst geladen.

Dies ist, was in meinem Fall passiert ist, möglicherweise ist dies der allgemeine universelle Fall. Ich bin mir nicht ganz sicher, aber das habe ich durch das Graben zusammengetragen.

0
Anirban Roy Das