Maximaler Wert für den Cache-Steuerungsheader in HTTP

80

Ich verwende Amazon S3, um statische Assets für meine Website bereitzustellen. Ich möchte, dass Browser diese Assets so lange wie möglich zwischenspeichern. Welche Metadaten-Header sollte ich in mein Vermögen aufnehmen?

Cache-Control: max-age=???
Casey Flynn
quelle
Der mögliche Maximalwert ist abhängig von Browser / Version und einem Proxy im Weg ... AFAIK gibt es keinen echten Standard / Spezifikation, daher wäre jeder Wert eine Vermutung ...
Yahia

Antworten:

120

In der Regel wird ein Jahr als Standardmaximalwert empfohlen. Siehe RFC 2616 :

Um eine Antwort als "Nie abläuft" zu markieren, sendet ein Ursprungsserver ein Ablaufdatum ungefähr ein Jahr nach dem Zeitpunkt, an dem die Antwort gesendet wird. HTTP / 1.1-Server sollten keine Ablaufdaten senden, die länger als ein Jahr in der Zukunft liegen.

Obwohl dies für den älteren expiresStandard gilt, ist es sinnvoll, dies auch zu tun, wenn cache-controlkeine expliziten Richtlinien für Standards vorliegen. Es ist so lange, wie Sie es im Allgemeinen sowieso brauchen sollten, und die Auswahl eines beliebig längeren Werts könnte einige Benutzeragenten beschädigen. Damit:

Cache-Control: max-age=31536000
Mahemoff
quelle
22

Speichern Sie es nicht "so lange wie möglich", sondern so lange wie möglich. Zum Beispiel ist es unwahrscheinlich, dass Sie es länger als 10 Jahre zwischenspeichern müssen ... habe ich recht?

Der RFC erörtert das maximale Alter hier: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

Eric Lawrence sagt, dass Internet Explorer vor IE9 jede Ressource mit einem Cache-Control als veraltet behandeln würde: Maximaler Alterswert über 2147483648 (2 ^ 31) Sekunden, ungefähr 68 Jahre ( http://blogs.msdn.com/b) /ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx ).

Andere Benutzeragenten variieren natürlich, also ... versuchen Sie, eine Zahl zu wählen, die wahrscheinlich (und nicht wahrscheinlich!) Einen Überlauf verursacht. Ein Höchstalter von mehr als 31536000 (ein Jahr) ist wenig sinnvoll, und dies wird informell als angemessener Höchstwert angesehen.

Geoffrey McGrath
quelle
Ich suche tatsächlich nach den spezifischen Headern, die gesendet werden sollen. Ich habe einen Mechanismus in meine Website eingebaut, um die URL der Datei so zu ändern, dass sie auf einen anderen Dateinamen verweist, wenn ich eine Änderung vornehmen muss und die Besucher sie sehen müssen. Ich brauche nur ein Beispiel für die spezifischen Header, die gesendet werden müssen, damit Browser diese Assets auf unbestimmte Zeit zwischenspeichern können.
Casey Flynn
12
Cache-Kontrolle: max-age = 31536000 speichert es für 1 Jahr im Cache, was maximal empfohlen wird.
EricLaw
2
@ Geoffrey: Ich denke, Sie sind verwirrt darüber, was Casey baut. Er sagt einfach, dass er die URL ändern wird, auf die er in seinem Markup verweist, wenn sich die Version ändert. Dies ist eine bewährte Methode, die von den meisten Top-Websites verwendet wird.
EricLaw
@Geoffrey Bist du sicher, dass es "über 2147483648" ist? Ich hatte gedacht, es wäre "über 2147483647"?
Pacerier
4

Die Leute, die die Empfehlung für ein Caching von maximal 1 Jahr erstellt haben, haben es nicht richtig durchdacht.

Wenn einem Besucher eine veraltete zwischengespeicherte Datei zugestellt wird, warum sollte es dann von Vorteil sein, wenn er nach 1 Jahr plötzlich eine neue Version lädt? Wenn eine Datei aus funktionaler Sicht eine TTL von 1 Jahr hat, bedeutet dies offensichtlich, dass die Datei überhaupt nicht geändert werden soll.

Warum sollte man also mehr als 1 Jahr brauchen?

1) Warum nicht? Es hat keinen Zweck, dem Besucherbrowser mitzuteilen, "Hey, diese Datei ist 1 Jahr alt, es könnte eine Idee sein, zu überprüfen, ob sie aktualisiert wurde".

2) CDN-Dienste. Die meisten Content Delivery-Netzwerke verwenden den Cache-Header, um zu entscheiden, wie lange eine Datei effizient vom Edgeserver bereitgestellt werden soll. Wenn Sie über eine 1-Jahres-Cache-Kontrolle für die Dateien verfügen, werden irgendwann nicht geänderte Dateien vom Ursprungsserver erneut angefordert, und der Edge-Cache muss vollständig neu gefüllt werden, was zu langsameren und unnötigen Ladevorgängen für den Client führt ruft zum Ursprung.

Was bringt es, maximal 1 Jahr zu haben? Welche Browser ersticken an einem Betrag, der höher als 31536000 ist?

suncat100
quelle
3
1 Jahr ist eine Ewigkeit im Internetzeitalter. Wenn Sie das Caching ernst nehmen, würden Sie (zusätzlich zur Cache-Kontrolle) den zuletzt geänderten und / oder etag-Mechanismus behandeln. Selbst diese erneuten Anfragen ein Jahr später schaden der Bandbreite nicht (304 nicht geändert)
redben
2
1 Jahr ist keine Ewigkeit, wenn Ihre Bilder NIE geändert werden (wie die meisten Bilder im Internet) und wenn Sie nicht möchten, dass ein CDN Dateien vom Ursprung aktualisiert (was sinnlos wäre). Was zuletzt geändert / etag betrifft, so wird natürlich eine Anfrage und ein Dialog zwischen Client und Server initiiert, um herauszufinden, was wir bereits wissen: "Ja, es ist immer noch in Ordnung, die zwischengespeicherte Datei bereitzustellen". Ihr Argument lautet im Grunde "1 Jahr ist eine Ewigkeit im Internet", was nichts Produktives bringt. Ich habe festgelegt, dass 10 Jahre für Bilder ablaufen, was einfach zu einem besseren Endergebnis führt.
Suncat100
3
Oh, und es gibt auch die Standardgröße des Browser-Cache. Würde ein zwischengespeichertes Asset ein Jahr in einem Browser-Cache überleben? Ich weiß es nicht.
Redben
Äußerst unwahrscheinlich. Etwas, das die Sinnlosigkeit der Einstellung von "1 Jahr" weiter beweist, wenn es keinem anderen Zweck dient als dem Versuch, ein Element "für immer" oder "so lange wie möglich" zwischenzuspeichern ...
suncat100
Es geht nicht darum, dass der Browser es zwischenspeichert. Es geht um Zwischen-Proxys, die es zwischenspeichern, wie Akamai und Varnish und Googles mobiler Proxy usw.
Elijah Lynn