Es gibt mehr als einen Weg zum Cachen.
Bedingtes GET
Wenn Sie diese Bilder im Dateisystem speichern und direkt über den Webserver bereitstellen, verwenden Sie wahrscheinlich bereits das bedingte Abrufen . Der Web - Server verwendet Dateisystem - Metadaten automatisch einen ETAG - Header zu setzen, und wird automatisch antworten mit „304 Not Modified“ , wenn der Browser enthält If-Modified-Since
oder If-Matches
Header in seiner Anfrage. (Alle Browser werden.)
In diesem Fall wird nicht das gesamte Bild zurückgesendet, sodass Sie Bandbreiteneinsparungen erzielen. Es wird jedoch weiterhin eine GET-Anforderung ausgegeben, sodass Sie weiterhin den Overhead und die Latenz einer Anforderung haben.
Sie können die Anzahl der Anforderungen auf Kosten der Cache-Aktualität geringfügig verringern, indem Sie auf Ihrem Webserver Cache-Control
Header mit einem public,max-age=N
Wert für Ihre Bilder festlegen . Dies bedeutet, dass Caches die Ressource höchstens max-age
Sekunden lang behalten können, bevor sie überprüfen müssen, ob sie aktualisiert wurde.
HTTP definiert jedoch nur eine Möglichkeit, einen Cache-Eintrag ungültig zu machen, die möglicherweise nicht zur Semantik Ihrer Anwendung passt: Wenn Sie eine URL POSTEN oder PUTEN, die das Profilfoto aktualisiert, antworten Sie mit einem Location: [url of photo]
Header, und der Cache-Eintrag für diese URL wird ungültig.
(Dies ist der Mechanismus, mit dem Sie eine Webseite mit Kommentaren zwischenspeichern und die Seite dann vom Browser zwangsweise neu laden lassen können, nachdem der Benutzer einen neuen Kommentar veröffentlicht hat. Der Browser antwortet auf ein POST /comment
mit 303 See Other
und ein Location: /page/with/comment
. Beachten Sie, dass dies nicht verwendet wurde wegen eines langjährigen Fehlers in Firefox zu arbeiten .)
Wenn Sie nicht viel Verkehr haben, ist dieser Ansatz zum Zwischenspeichern in Ordnung.
URLs ändern
Eine URL ist eine Darstellung einer Ressource. Eine andere Möglichkeit zum Verwalten des Caching besteht darin, die Cache-Parameter für die Ressource nicht zu ändern, sondern eine brandneue Ressource mit der Anweisung "Cache für immer" zu erstellen. Dies ist der Ansatz, den die "großen Jungs" bevorzugen, da sie keine zusätzlichen Anforderungen generieren können, wodurch sie viel Bandbreite sparen. Der Nachteil ist, dass viel mehr zusätzliche Buchhaltung erforderlich ist.
Hierfür gibt es zwei allgemeine Techniken.
Zeichenfolgen abfragen
Webserver ignorieren Abfragezeichenfolgen, wenn sie eine Datei aus dem Dateisystem bereitstellen. Caches jedoch nicht: /1.jpg?t=12345
und /1.jpg?t=67890
sind zwei völlig unterschiedliche, nicht miteinander verbundene Ressourcen, obwohl der Server glaubt, dass sie gleich sind.
Eine einfache Möglichkeit besteht darin, den Zeitstempel des Dateisystems als Abfragezeichenfolge anzuhängen, wenn Sie auf eine Ressource in Ihrem HTML-Code verweisen und einen langen Expires
Header festlegen . Der Browser speichert diese Ressource dann für immer im Cache und führt keine GETs durch, solange sich die Abfragezeichenfolge nicht ändert.
Ein Nachteil ist, dass es schwierig oder unmöglich ist, den Webserver über die neue URL für ein Element zu informieren, wenn Sie einen Cache zwangsweise ungültig machen möchten. Wenn ein Browser beispielsweise eine zwischengespeicherte HTML-Seite mit einer /1.jpg?v=1
Referenz hat, aber zufällig den Eintrag für /1.jpg?v=1
gelöscht hat (möglicherweise ist ihm die Datei oder der Speicherplatz ausgegangen), wird eine neue Anforderung an gesendet /1.jpg?v=1
. Wenn sich das Bild in der Zwischenzeit geändert hat /1.jpg?v=2
, lautet die richtige Antwort entweder:
- Servieren Sie die alte Version der Datei. Sie würden dies tun, wenn Sie möchten, dass alle Ressourcen zu einem bestimmten Zeitpunkt miteinander konsistent sind. Dies sollten Sie beispielsweise mit CSS-Dateien tun, da eine neue CSS-Datei mit einer alten HTML-Datei möglicherweise nicht richtig funktioniert!
- Leiten Sie mit auf die neue Version der Datei um
301 Moved Permanently
. Sie würden dies tun, wenn Sie möchten, dass alle Ressourcen so neu wie möglich sind.
Beides ist mit einem Webserver allein nur schwer möglich. Daher müssen Sie eine Webanwendung auch für Bildanforderungen aufrufen, was sowohl komplizierter als auch ressourcenintensiver sein kann. Webserver können Dateien sehr schnell bereitstellen, sodass der Overhead einer Webanwendung möglicherweise Ihre Bandbreite und Latenzgewinne verschlingt.
Dateinamen
Anstatt eine Abfragezeichenfolge hinzuzufügen, ändern Sie den Dateinamen. Dies bedeutet, dass es einfach ist, mehrere Versionen von Dateien im Dateisystem zu speichern, aber Sie müssen wahrscheinlich Dateimetadaten speichern und andere Datenbankbücher führen, um Ihre Ressourcen und deren Namen im Auge zu behalten.