2009-02-18 13 views
13

In Apache mod_expires Modul gibt es die Expires Richtlinie mit zwei Basiszeitperioden, Zugang und Modifikation.Cache Control Ablaufen mit der letzten Änderung

ExpiresByType text/html "access plus 30 days" 

bedeutet verständlicherweise, dass der Cache nach 30 Tagen nach frischem Inhalt fragt. Jedoch

,

ExpiresByType text/html "modification plus 2 hours" 

nicht intuitiv Sinn machen.

Woher weiß der Browser-Cache, dass die Datei geändert wurde, wenn sie keine Anfrage an den Server stellt? Und wenn es einen Aufruf an den Server macht, wie wird diese Anweisung zwischengespeichert? Es scheint mir, dass ich einen entscheidenden Teil des Caching nicht verstehe. Bitte erleuchte mich.

Antwort

35

Eine Expires* Direktive mit "Modifikation" als Basis bezieht sich auf die Änderungszeit der Datei auf dem Server. Wenn Sie beispielsweise "Modification plus 2 hours" einstellen, wird jeder Browser, der innerhalb von 2 Stunden nach der Änderung der Datei (auf dem Server) Inhalte anfordert, diesen Inhalt bis 2 Stunden nach der Änderungszeit der Datei zwischenspeichern. Und der Browser weiß, wann diese Zeit ist, weil der Server einen Header Expires mit der richtigen Ablaufzeit sendet.

Lassen Sie mich mit einem Beispiel erklären: sagen Sie Ihre Apache-Konfiguration die Zeile

ExpiresDefault modification plus 2 hours 

enthält und Sie haben eine Datei index.html, die die ExpiresDefault Richtlinie gilt, auf dem Server. Angenommen, Sie laden eine Version von index.html um 9:53 GMT hoch und überschreiben die vorhergehende index.html (falls es eine gab). Jetzt ist die Modifikationszeit von index.html 9:53 GMT. Wenn Sie wurden ls -l auf dem Server (oder dir unter Windows) ausgeführt wird, würden Sie es in der Liste sehen:

-rw-r--r-- 1 apache apache 4096 Feb 18 09:53 index.html 

Jetzt, mit jeder Anfrage, sendet Apache die Last-Modified Header mit der letzten Änderung der Datei. Da Sie diese ExpiresDefault Direktive haben, sendet es auch den Expires Header mit einer Zeit, die der Modifikationszeit der Datei (9:53) plus zwei Stunden entspricht. Also hier ist ein Teil von dem, was der Browser sieht:

Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT 
Expires: Wed, 18 Feb 2009 11:53:00 GMT 

Wenn der Zeitpunkt, an dem der Browser diese Anforderung ist vor 11.53 Uhr GMT macht, wird der Browser die Seite zwischenspeichern, da es noch nicht abgelaufen ist.Wenn der Benutzer die Seite also zum ersten Mal um 11:00 GMT besucht und dann um 11:30 GMT wieder auf die gleiche Seite geht, wird der Browser sehen, dass seine zwischengespeicherte Version noch gültig ist und nicht (oder besser, nicht)) Erstellen Sie eine neue HTTP-Anfrage.

Wenn der Benutzer ein drittes Mal um 12:00 GMT auf die Seite geht, sieht der Browser, dass seine zwischengespeicherte Version nun abgelaufen ist (es ist nach 11:53), also versucht er die Seite zu validieren und sendet eine Anfrage an die Server mit einem If-Modified-Since-Header. Eine Antwort 304 (nicht geändert) ohne Nachricht wird zurückgegeben, da das Datum der Seite seit der ersten Zustellung nicht geändert wurde. Da das Ablaufdatum abgelaufen ist - die Seite ist "veraltet" - wird bei jedem weiteren Besuch der Seite eine Validierungsanfrage gestellt, bis die Validierung fehlschlägt.

Nun stellen wir uns statt dessen vor, dass Sie um 11:57 eine neue Version der Seite hochgeladen haben. In diesem Fall wird der Versuch der Browser die alte Version der Seite um 12:00 Uhr zur Validierung schlägt fehl, und es empfängt in der Antwort, zusammen mit der neuen Seite, diese beiden neuen Header:

Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT 
Expires: Wed, 18 Feb 2009 13:57:00 GMT 

(Die letzte Änderungszeit der Datei wird 11:57 beim Hochladen der neuen Version, und Apache berechnet die Ablaufzeit als 11:57 + 2:00 = 13:57 GMT.)

Validierung (mit dem jüngeren Datum) wird nicht sein benötigt jetzt bis 13:57 Uhr.

(Hinweis natürlich, dass viele andere Dinge, zusammen mit den beiden Header gesendet werden, die ich oben aufgeführt, ich getrimmt nur aus den ganzen Rest der Einfachheit halber)

+0

Hallo David, das macht Sinn, allerdings bin ich mir noch nicht sicher, warum und wie der Server den Browser sendet. Also, wenn ich das richtig verstehe, sendet der Server beim nächsten Mal, wenn der Browser die Ressource anfordert, Informationen an den Browser über den Änderungsstatus der Dateien - aber das ist kein Ergebnis –

+0

Ich dachte, das wäre am einfachsten mit einem Beispiel zu erklären Ich bearbeitete eins in ... –

+0

genial danke für Ihre Zeit –

0

Mein Verständnis ist, dass die Änderung fordert den Browser, die Cache-Zeit basierend auf dem Last-Modified HTTP-Header-Wert basieren. Also, Modifikation plus 2 Stunden wäre die Last-Modified Zeit + 2 Stunden.

3

Der Server sendet eine Kopfzeile wie: "Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT". Der Cache verhält sich entweder auf dieser Kopfzeile oder der Zugriffszeit.

Sagen Sie, wenn erwartet wird, dass der Inhalt jeden Tag aktualisiert wird, dann soll es "Modifikation plus 24 Stunden" ablaufen.

Wenn Sie nicht wissen, wann der Inhalt aktualisiert wird, ist es besser, die Zugriffszeit zugrunde zu legen.

+0

Hallo Andrew, Danke für deine Antwort. Wann und wie oft sendet der Server den zuletzt geänderten Header? oder passiert es während einer Browsersitzung –

0

Vor allem dank David Z für die detaillierte Erklärung über . Als Antwort auf die Frage von Buschmann, warum es sinnvoll ist, Caching aufzurufen, wenn der Server noch eine Anforderung stellen muss, lautet die Antwort, dass die Zeit in dem gespeichert wird, was vom Server zurückgegeben wird. Wenn die Cache-Direktiven angeben, dass der Inhalt einer Datei immer noch frisch ist, wird anstelle des Inhalts ein 304-Code mit einem leeren Antworttext zurückgegeben. Dort wird die Zeit gerettet.

Eine bessere Erklärung als ich gegeben habe, ist hier von https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers:

Obwohl bedingte Anfragen rufen Sie einen Anruf über das Netzwerk, führen nicht modifizierten Ressourcen in einem leeren Antworttext - Einsparung der Kosten der Übertragung von Ressource zurück zum Endkunden. Der Back-End-Dienst ist auch oft in der Lage, das letzte Änderungsdatum einer Ressource sehr schnell zu bestimmen, ohne auf die Ressource zuzugreifen, die selbst nicht-triviale Verarbeitungszeit spart.

Zeitbasierte

Eine zeitbasierte bedingte Anforderung stellt sicher, dass nur dann, wenn die angeforderte Ressource im Cache gespeichert wird der Inhalt übertragen wurde geändert Kopie des seit dem Browser. Wenn die zwischengespeicherte Kopie die aktuellste ist, gibt der Server den Antwortcode 304 zurück.

Um bedingte Anforderungen zu aktivieren, gibt die Anwendung die letzte geänderte Uhrzeit einer Ressource über den Last-Modified-Antwortheader an.

Cache-Control: public, max-age = 31536000 Last-Modified: Mo, 3. Januar 2011 17.45.57 GMT

Das nächste Mal, wenn der Browser diese Ressource anfordert es nur für die Inhalte fragt hasn Mo, 3. Januar 2011 17.45.57 GMT

wenn die Ressource‘: die Ressource, wenn sie unverändert sind die seit diesem Zeitpunkt unter Verwendung von If-Modified-Since-Anfrage-Header

If-Modified-Since t geändert seit Mon, 03 Jan 2011 17:45:57 GMT Der Server wird mit einem leeren Body mit dem 304 Response Code zurückkommen.

Verwandte Themen