Warum wird diese Antwort zwischengespeichert?


32

Ich habe einen Client, dessen index.html der Site derzeit mit den folgenden Headern zurückkommt:

Accept-Ranges: Bytes
Verbindung: Keep-Alive
Inhaltscodierung: gzip
Inhaltslänge: 3658
Inhaltstyp: Text / HTML
Datum: Donnerstag, 10. Oktober 2013, 07:36:27 Uhr GMT
ETag: 4aa95e1-2ed2-4e721324728b7
Keep-Alive: Timeout = 5, max = 100
Letzte Änderung: Dienstag, 24. September 2013, 13:34:30 Uhr GMT
Server: Apache / 2.2.22
Vary: Accept-Encoding, User-Agent

Ich werde natürlich empfehlen , dass sie hinzufügen Expiresoder Cache-Controlgegebenenfalls, aber ich bin verwirrt: Chrome speichert diese Ressource und Anwendungen aus dem Cache (nicht Senden eine Anfrage überhaupt ), auch nach mehreren Stunden (zum Beispiel, es wiederverwendet eine Kopie es wurde gestern um 13.30 Uhr an diesem Morgen um 8.30 Uhr zwischengespeichert). Ich kann dies ganz deutlich auf der Registerkarte "Netzwerk" der Chrome-Konsole sehen, auf der die Anfrage angezeigt wird und in der Spalte " Status" und in der Spalte " Größe"200 (OK) grau angezeigt wird. (Ich habe die Caching-Standardeinstellungen von Chrome nicht geändert.)(from cache)

Mir ist klar, dass die Spezifikation es Benutzeragenten ermöglicht, in Abwesenheit von Anweisungen aus den Kopfzeilen ihre eigene Entscheidung zu treffen . Passiert das hier? Chrome hat festgestellt, dass es vor einigen Tagen zuletzt geändert wurde, und es steht Ihnen frei, eine Version zu verwenden, die beispielsweise bis zu einem Tag veraltet ist. Oder fehlt mir etwas?

Antworten:


33

Wenn „Ablaufdatum“ und „Cache-Control“ Header nicht angegeben werden , sondern ein „Last-Modified“ Header wird angegeben, Browser zu erraten, wie lange sie das Dokument im Cache halten soll. Einige Browser tun verwenden Algorithmen, die die Seite bleiben im Cache für einen Tag oder mehr lassen.

Im Leitfaden zu bewährten Methoden für das Zwischenspeichern in Google heißt es:

Last-Modified ist ein "schwacher" Caching-Header, da der Browser eine Heuristik anwendet, um zu bestimmen, ob das Element aus dem Cache abgerufen werden soll oder nicht. (Die Heuristiken unterscheiden sich zwischen verschiedenen Browsern.)


Mozilla (Firefox) hat eine häufig gestellte Frage zum HTTP-Caching , in der der Algorithmus für diese Situation beschrieben wird (obwohl es möglich ist, dass sich der Algorithmus seit dem Datum des Dokuments 2002 geändert hat):

... suchen wir nach einem "Last-Modified" -Header. Wenn dieser Header vorhanden ist, entspricht die Lebensdauer des Caches dem Wert des Headers "Date" abzüglich des Werts des Headers "Last-modified" geteilt durch 10.

In Ihrem Fall, in dem der Unterschied zwischen "Geändert" und "Jetzt" 15 Tage beträgt, würde Firefox die Ressource 1,5 Tage lang zwischenspeichern.

Es scheint, dass alle gängigen Browser dieselbe 10% -Regel verwenden, die Firefox implementiert. Eine Frage wurde auf StackOveflow gefragt für diese Heuristik zu fragen . Unterschiedliche Antworten für unterschiedliche Browser zeigen, dass sie alle ähnliche Implementierungen haben. Es gibt Antworten für Internet Explorer und Webkit (Chrome und Safari).


Die Größe des Cache des Browsers ist wahrscheinlich der begrenzende Faktor für eine Datei, die nach dem Caching-Algorithmus möglicherweise länger als einen Tag aufbewahrt wird. Browser haben im Allgemeinen eine Einstellung für die Menge an Festplattenspeicher, die sie für den Cache verwenden. Viele Benutzer leeren ihren Cache auch, wenn sie ihren Browser schließen. Daher hängt die Zeitspanne, für die eine solche Datei zwischengespeichert wird, normalerweise ab von:

  • Der vom Browser zugewiesene Cache-Speicherplatz
  • Die Anzahl der von einem Benutzer besuchten Websites (und die Größe dieser Websites)
  • Gibt an, ob der Benutzer seinen Browser geschlossen hat

Können Sie bitte klären, "dann würde Firefox die Ressource für 1,5 Tage zwischenspeichern." Ab welchem ​​Datum werden bis zu 1,5 Tage zwischengespeichert? Wenn es schon 15 Tage sind, dann wäre es doch schon abgelaufen, oder? Und da JETZT minus zuletzt geändert für immer zunimmt, wird es für immer zwischengespeichert!
MyDoggyWritesCode

1
Nicht für immer. Für 1/10 der Zeit zwischen dem letzten geänderten Header und dem Zeitpunkt des Downloads. Wenn für Sie 15 Tage vergangen sind, kann dies bedeuten, dass 150 Tage vergangen sind, seit die Datei zuletzt geändert wurde.
Stephen Ostermiller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.