ETag vs Header läuft ab

359

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?

GeoffreyF67
quelle
1
developer.mozilla.org/en-US/docs/Web/HTTP/Caching (allgemein gut)
Christophe Roussy

Antworten:

677

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.

Marc Novakowski
quelle
12
Sie sollten auch prüfen, ob Sie Cache-Control anstelle von Expires verwenden sollten. Nach meinem Verständnis wurde Cache-Control nach Ablauf eingeführt und bietet Ihnen mehr Kontrolle. Siehe stackoverflow.com/questions/5799906/…
Luis Perez
6
Bei Verwendung des Expires-Headers empfiehlt es sich, den Dateinamen zu ändern, wenn sich eine Ressource ändert, da der Client die Datei nicht erneut anfordert, bevor sie veraltet ist. Vor allem, wenn Sie weit entfernte zukünftige Werte als Ablaufdatum verwenden.
Schnatterer
8
Nehmen wir an, wir werden beide verwenden. Was passiert, wenn die Ablaufzeit abgelaufen ist, die Datei jedoch nicht geändert wird (das Etag ist dasselbe)? Der Server gibt 304 zurück und die Datei wird aus dem Browser-Cache bereitgestellt. Meine Frage ist, wird die Ablaufzeit in diesem Moment neu generiert?
user345602
2
Stellen Sie ETAG und den Expires-Header vorsichtig auf einen Wert ungleich Null ein. Dies kann zu Rennbedingungen führen. Siehe jakearchibald.com/2016/caching-best-practices
Weston
2
Ist es möglich, den Servern anzuweisen, überhaupt keine Inodes oder Zeitstempel zu verwenden? Warum werden sie auch für ETags benötigt, wenn sie nur zur Darstellung von Inhalten verwendet werden?
Seza
108

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.

John
quelle
31

Expiresund Cache-Controlsind "starke Caching-Header"

Last-Modifiedund ETagsind "schwache Caching-Header"

Zuerst prüft der Browser Expires/Cache-Control, ob eine Anfrage an den Server gestellt werden soll oder nicht

Wenn eine Anfrage gestellt werden muss, wird Last-Modified/ETagdie HTTP-Anfrage gesendet. Wenn der EtagWert 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.

hienbt88
quelle
1
Finden Sie ein Dokument, das das "starke und schwache" Caching-Verhalten unterstützt? Ich konnte keinen finden und mein Client-Browser priorisiert jetzt die zuletzt geänderten gegenüber den abgelaufenen, was ich nicht verstehe, warum.
GMsoF
1
@ GMsoF Vielleicht möchten Sie einen Blick darauf werfen
Medeiros
Wenn ich also sicherstellen möchte, dass meine Änderungen sofort an den Client weitergegeben werden, aber dennoch von einem gewissen Caching profitieren, kann ich nur Last-Modified und ETag verwenden, oder?
Sebastien Lorber
Dies ist die prägnanteste und doch klarste Antwort für mich! Vielen Dank.
Aderchox
18

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.

David Z.
quelle
Das ETag hat also die letzte Änderung und der abgelaufene Header teilt ihm mit, dass es zwischengespeichert werden soll. Wenn ich meine Datei hochlade und überschreibe, wird sie einfach wieder in den Cache des Benutzers verschoben, andernfalls wird ein 304 generiert, oder?
GeoffreyF67
Der Etag hängt in komplizierter Weise vom Datum der letzten Änderung ab. Wenn Sie jedoch die Datei ändern, ändert sich das Etag. Dann stimmt das vom Browser gesendete Etag (für die zwischengespeicherte Version der Datei) nicht mit dem Etag der Datei auf dem Server überein, und Apache sendet die Datei anstelle einer 304-Antwort.
David Z
6
Wird der Header für ein Jahr nicht abgelaufen und der Client aufgefordert, ein Jahr lang nicht einmal nach einer neuen Version zu suchen?
John Bachir
@ John: Ja, ich denke, ich habe an statische Inhalte gedacht, die sich nie ändern, als ich das geschrieben habe.
David Z
2
@ John Bachir: Das sollte erwartet werden, aber der Browser scheint den Server trotzdem zu treffen, zumindest um nach einer neueren Version zu fragen. Ich habe eine weitere Frage zu diesem Problem gestellt: stackoverflow.com/questions/10048740/…
Marco Demaio
13

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!

Benjamin Piette
quelle
2
In diesem Fall müssen Sie Ihr js grundsätzlich umbenennen und in Ihrem HTML-Code ändern und hoffen, dass Sie nicht festgelegt haben, dass die HTML-Datei auch 1 Jahr abläuft.
EralpB
1

Eine weitere Sache, die ich erwähnen möchte, dass einige der Antworten möglicherweise übersehen wurden, ist der Nachteil, beide ETagsund Expires/Cache-controlin 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/

aneagoie
quelle
1

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.

Sonnig
quelle
0

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.jsdie Verwendung von Expires Header. Außerdem werden die Netzwerkkosten gesenkt.

Ich hoffe es hilft ;)

Jack Chen
quelle