Ich habe mich umgesehen, konnte aber nicht herausfinden, ob ich sowohl einen ETag- als auch einen Expires-Header oder den einen oder anderen verwenden sollte.
Ich versuche sicherzustellen, dass meine Flash-Dateien (und andere Bilder und was nicht nur aktualisiert werden, wenn diese Dateien geändert werden).
Ich möchte nichts Besonderes tun, wie den Dateinamen zu ändern oder seltsame Zeichen am Ende der URL anzubringen, damit sie nicht zwischengespeichert wird.
Gibt es in meinen PHP-Skripten irgendetwas, das ich programmgesteuert tun muss, um dies zu unterstützen, oder ist alles Apache?
http
caching
etag
expires-header
GeoffreyF67
quelle
quelle
Antworten:
Sie unterscheiden sich geringfügig - der ETag verfügt über keine Informationen, anhand derer der Client bestimmen kann, ob er diese Datei in Zukunft erneut anfordern möchte oder nicht. Wenn ETag alles ist, was es hat, muss es immer eine Anfrage stellen. Wenn der Server das ETag jedoch aus der Clientanforderung liest, kann der Server dann bestimmen, ob die Datei gesendet werden soll (HTTP 200) oder der Client angewiesen wird, nur seine lokale Kopie zu verwenden (HTTP 304). Ein ETag ist im Grunde nur eine Prüfsumme für eine Datei, die sich semantisch ändert, wenn sich der Inhalt der Datei ändert.
Der Expires-Header wird vom Client (und den Proxys / Caches) verwendet, um zu bestimmen, ob überhaupt eine Anforderung an den Server gestellt werden muss oder nicht. Je näher Sie dem Ablaufdatum sind, desto wahrscheinlicher ist es, dass der Client (oder Proxy) eine HTTP-Anforderung für diese Datei vom Server stellt.
Sie möchten also BEIDE Header verwenden - setzen Sie den Expires-Header auf einen angemessenen Wert, der davon abhängt, wie oft sich der Inhalt ändert. Konfigurieren Sie dann die zu sendenden ETags so, dass Clients beim Senden einer Anforderung an den Server leichter feststellen können, ob die Datei zurückgesendet werden soll oder nicht.
Ein letzter Hinweis zu ETag: Wenn Sie ein Server-Setup mit Lastenausgleich mit mehreren Computern verwenden, auf denen Apache ausgeführt wird, möchten Sie wahrscheinlich die ETag-Generierung deaktivieren. Dies liegt daran, dass Inodes als Teil des ETag-Hash-Algorithmus verwendet werden, der sich zwischen den Servern unterscheidet. Sie können Apache so konfigurieren, dass keine Inodes als Teil der Berechnung verwendet werden. Dann möchten Sie jedoch sicherstellen, dass die Zeitstempel in den Dateien genau gleich sind, um sicherzustellen, dass für alle Server dasselbe ETag generiert wird.
quelle
Etag- und zuletzt geänderte Header sind Validatoren .
Sie helfen dem Browser und / oder dem Cache (Reverse Proxy) zu verstehen, ob sich eine Datei / Seite geändert hat, auch wenn sie denselben Namen beibehält.
Läuft ab und Cache-Kontrolle gibt Aktualisierungsinformationen .
Dies bedeutet, dass sie den Browser und die umgekehrten Zwischen-Proxys informieren, bis zu welcher Zeit oder wie lange sie die Seite / Datei in ihrem Cache behalten können.
Die Frage ist also normalerweise, welcher Validator verwendet, etag oder zuletzt geändert werden soll und welcher Aktualisierungsinformationsheader verwendet werden soll, abläuft oder die Cache-Kontrolle übernimmt.
quelle
Expires
undCache-Control
sind "starke Caching-Header"Last-Modified
undETag
sind "schwache Caching-Header"Zuerst prüft der Browser
Expires/Cache-Control
, ob eine Anfrage an den Server gestellt werden soll oder nichtWenn eine Anfrage gestellt werden muss, wird
Last-Modified/ETag
die HTTP-Anfrage gesendet. Wenn derEtag
Wert des Dokuments mit diesem übereinstimmt, sendet der Server einen 304-Code anstelle von 200 und keinen Inhalt. Der Browser lädt den Inhalt aus seinem Cache.quelle
Standardmäßig generiert Apache ein Etag basierend auf der Inode-Nummer, dem Datum der letzten Änderung und der Größe der Datei. Dies sollte vollkommen in Ordnung sein, um das zu tun, was Sie wollen. Ich denke, es wird auch standardmäßig ein Header für die letzte Änderung generiert, der auf der letzten Änderungszeit der Datei auf der Festplatte basiert. Dies ist auch vollkommen in Ordnung, um das zu tun, was Sie wollen.
Sie sollten Apache wahrscheinlich auch einen Expires-Header senden lassen, der ein Jahr in der Zukunft datiert ist (laut http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ), damit die Browser wissen, dass der Inhalt ist zwischenspeicherbar. Schauen Sie sich mod_expires an, um das zu konfigurieren.
quelle
Eine weitere Zusammenfassung:
Sie müssen beide verwenden. ETags sind "serverseitige" Informationen. Läuft ab ist ein "clientseitiges" Caching.
Verwenden Sie ETags, außer wenn Sie einen Server mit Lastenausgleich haben. Sie sind sicher und teilen den Clients mit, dass sie jedes Mal, wenn Sie etwas an Ihrer Seite ändern, neue Versionen Ihrer Serverdateien erhalten sollten.
Expires müssen mit Vorsicht verwendet werden, da Sie ein Ablaufdatum weit in der Zukunft festlegen, aber eine der Dateien sofort ändern möchten (z. B. eine JS-Datei). Einige Benutzer erhalten die geänderte Version möglicherweise erst nach langer Zeit!
quelle
Eine weitere Sache, die ich erwähnen möchte, dass einige der Antworten möglicherweise übersehen wurden, ist der Nachteil, beide
ETags
undExpires/Cache-control
in Ihren Kopfzeilen zu haben.Abhängig von Ihren Anforderungen werden möglicherweise nur zusätzliche Bytes in Ihre Header eingefügt, wodurch die Pakete erhöht werden und mehr TCP-Overhead entsteht. Auch hier sollten Sie prüfen, ob der Aufwand, beide Dinge in Ihren Headern zu haben, erforderlich ist oder ob Ihre Anforderungen nur zusätzliches Gewicht erhalten, was die Leistung verringert.
Sie können mehr darüber in diesem ausgezeichneten Blog-Beitrag von Kyle Simpson lesen: http://calendar.perfplanet.com/2010/bloated-request-response-headers/
quelle
Meiner Ansicht nach kann der Server dem Client mit Expire Header mitteilen, wann meine Daten veraltet sind, während der Server mit Etag den etag-Wert für jede Anforderung des Clients überprüft.
quelle
Mit ETag wird festgelegt, ob eine Ressource die Kopie verwenden soll. und Expires Header wie Cache-Control wird dem Client mitgeteilt, dass der Client vor den Cache-Jahrzehnten die lokale Ressource abrufen sollte.
In modernen Sites wird häufig eine Datei mit dem Namen hash angeboten, z. B.
app.98a3cf23.js
die Verwendung von Expires Header. Außerdem werden die Netzwerkkosten gesenkt.Ich hoffe es hilft ;)
quelle