web-dev-qa-db-de.com

ETag vs Header verfällt

Ich habe mich umgesehen, konnte aber nicht herausfinden, ob ich einen ETag und einen Expires-Header oder verwenden sollte.

Was ich versuche zu tun, ist sicherzustellen, dass meine Flash-Dateien (und andere Bilder und was nicht nur aktualisiert wird, wenn sich diese Dateien ändern).

Ich möchte nichts Besonderes tun, wie den Dateinamen ändern oder am Ende der URL ein paar seltsame Zeichen setzen, damit er nicht zwischengespeichert wird.

Gibt es auch etwas, das ich programmatisch in meinen PHP -Skripts tun muss, um dies zu unterstützen, oder ist das alles Apache?

347
GeoffreyF67

Sie unterscheiden sich geringfügig - der ETag verfügt über keine Informationen, anhand derer der Kunde feststellen kann, ob er diese Datei zukünftig erneut anfordern soll oder nicht. Wenn ETag alles ist, muss es immer eine Anfrage stellen. Wenn der Server jedoch das ETag aus der Clientanforderung liest, kann der Server dann bestimmen, ob die Datei gesendet werden soll (HTTP 200), oder der Client wird angewiesen, 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 Proxies/Caches) verwendet, um zu bestimmen, ob er überhaupt eine Anforderung an den Server stellen muss oder nicht. Je näher Sie am Ablaufdatum sind, desto wahrscheinlicher ist es, dass der Client (oder Proxy) eine HTTP-Anforderung für diese Datei vom Server absendet.

Sie möchten also BEIDE Header verwenden - setzen Sie den Expires-Header auf einen angemessenen Wert, je nachdem, wie oft sich der Inhalt ändert. Konfigurieren Sie dann die zu versendenden ETags so, dass Clients, wenn sie eine Anforderung an den Server senden, leichter feststellen können, ob die Datei zurückgeschickt werden soll oder nicht.

Noch ein letzter Hinweis zu ETag: Wenn Sie ein Server-Setup mit Lastenausgleich mit mehreren Maschinen 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 Inodes nicht als Teil der Berechnung verwendet wird. Sie sollten jedoch sicherstellen, dass die Zeitstempel in den Dateien exakt gleich sind, um sicherzustellen, dass für alle Server dasselbe ETag generiert wird.

657
Marc Novakowski

Etag und Last-modified -Kopfzeilen sind Validatoren .

Sie helfen dem Browser und/oder dem Cache (Reverse Proxy), zu verstehen, ob sich eine Datei/Seite geändert hat, auch wenn derselbe Name erhalten bleibt.

Expires und Cache-Control geben Refresh-Informationen .

Das heißt, sie informieren den Browser und die umgekehrten Zwischen-Proxys, zu welcher Zeit oder für wie lange sie die Seite/Datei in ihrem Cache behalten können.

Die Frage ist in der Regel, welcher Validator verwendet werden soll (etag oder last-modified) und welcher Refresh-Infomation-Header verwendet wird, der abläuft oder zwischengespeichert wird.

103
john

Expires und Cache-Control sind "starke Cache-Header"

Last-Modified und ETag sind "schwache Cache-Header"

Zuerst überprüft der Browser Expires/Cache-Control, um zu bestimmen, ob eine Anforderung an den Server gestellt werden soll oder nicht

Wenn eine Anforderung gestellt werden muss, wird Last-Modified/ETag in der HTTP-Anforderung gesendet. Wenn der Wert Etag des Dokuments mit dem übereinstimmt, sendet der Server einen 304-Code statt 200 und keinen Inhalt. Der Browser lädt den Inhalt aus seinem Cache.

28
hienbt88

Standardmäßig generiert Apache einen Etag basierend auf Inode-Nummer, Datum der letzten Änderung und Größe der Datei. Dies sollte perfekt sein, um das zu tun, was Sie möchten. Ich denke, es wird auch standardmäßig einen Last-Modified-Header generiert, der auf der letzten Änderungszeit der Datei auf der Festplatte basiert, was auch völlig in Ordnung ist, um das zu tun, was Sie möchten.

Sie sollten wahrscheinlich auch einen Expires-Header von Apache senden, der ein Jahr in der Zukunft (laut http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ) datiert ist, damit Browser weiß, dass der Inhalt zwischengespeichert werden kann. Schauen Sie sich mod_expires an, um das zu konfigurieren.

19
David Z

Eine weitere Zusammenfassung:

Sie müssen beide verwenden. ETags sind eine "serverseitige" Information. Expires sind eine Zwischenspeicherung auf der Clientseite.

  • Verwenden Sie ETags , es sei denn, Sie haben einen Server mit Lastausgleich. Sie sind sicher und werden den Kunden mitteilen, dass sie jedes Mal, wenn Sie etwas an Ihrer Seite ändern, neue Versionen Ihrer Serverdateien erhalten sollten.

  • Expires muss mit Vorsicht verwendet werden, als würden Sie ein Verfallsdatum weit in der Zukunft festlegen, aber eine der Dateien sofort ändern (z. B. eine JS-Datei), einige Benutzer erhalten die modifizierte Version möglicherweise erst nach langer Zeit Zeit!

13
Benjamin Piette

Eine weitere Sache, die ich gerne erwähnen möchte, ist, dass einige der Antworten möglicherweise verpasst wurden, dass sowohl ETags als auch Expires/Cache-control in Ihren Kopfzeilen vorhanden sind. 

Abhängig von Ihren Anforderungen können nur zusätzliche Bytes in Ihren Headern hinzugefügt werden, was die Anzahl der Pakete erhöhen kann, was zu mehr TCP Mehraufwand führt. Auch hier sollten Sie sehen, ob der Aufwand für beide Dinge in den Kopfzeilen erforderlich ist, oder Sie erhöhen lediglich das Gewicht Ihrer Anforderungen, 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/

1
aneagoie

Aus meiner Sicht kann der Server mit Expire Header dem Client mitteilen, wann meine Daten veraltet sind, während der Server mit Etag den etag-Wert für jede Clientanforderung prüft.

1
Sunny

ETag wird verwendet, um zu bestimmen, 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 gibt es häufig eine Datei mit dem Namen hash, wie app.98a3cf23.js, so dass die Verwendung von Expires Header eine gute Praxis ist. Außerdem werden die Netzwerkkosten reduziert.

Ich hoffe es hilft ;)

0
Jack Chen