2009-02-01 11 views
323

Ich habe sah sich aber nicht in der Lage gewesen, um herauszufinden, ob ich sowohl einen ETag und verwenden sollte ein Expires Header oder die eine oder andere.ETag vs Expires-Header

Was ich versuche sicher zu tun, ist, dass meine Flash-Dateien (und andere Bilder und was nicht nur aktualisiert, wenn es eine Änderung an diesen Dateien ist.

Ich will nicht, etwas zu tun besonderen wie den Dateinamen ändern oder einige komische Zeichen am Ende der URL einfügen, damit sie nicht zwischengespeichert wird

Gibt es auch irgendetwas, was ich programmatisch am Ende in meinen PHP-Skripten tun muss, um dies zu unterstützen oder ist es alles Apache?

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching (gut im Allgemeinen) –

Antwort

621

Sie unterscheiden sich geringfügig - der ETag verfügt über keine Informationen, die der Client verwenden kann, um zu bestimmen, ob die Datei in Zukunft erneut angefordert werden soll. Wenn ETag alles ist, was es hat, muss es immer eine Anfrage stellen. Wenn der Server den ETag jedoch von der Clientanforderung liest, kann der Server dann bestimmen, ob die Datei gesendet werden soll (HTTP 200), oder dem Client mitteilen, dass er nur seine lokale Kopie (HTTP 304) verwenden soll. Ein ETag ist im Grunde genommen 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 Proxies/Caches) verwendet, um festzustellen, ob er überhaupt eine Anforderung an den Server senden muss. 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 erstellt.

Also wirklich was Sie tun möchten, ist mit BEIDE Header - setzen Sie die Expires-Header auf einen angemessenen Wert, basierend darauf, wie oft der Inhalt ändert. Konfigurieren Sie anschließend ETags so, dass sie gesendet werden, sodass Clients, die eine Anforderung an den Server senden, leichter feststellen können, ob sie die Datei zurücksenden oder nicht.

Noch eine Anmerkung zu ETag: Wenn Sie ein Load-Balanced-Server-Setup mit mehreren Maschinen mit Apache verwenden, möchten Sie wahrscheinlich die ETag-Generation ausschalten. 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, aber dann sollten Sie sicherstellen, dass die Zeitstempel für die Dateien identisch sind, um sicherzustellen, dass das gleiche ETag für alle Server generiert wird.

+36

Diese Antwort hat gerade meinen Tag gemacht. Wir haben uns mit der Etag-Frage herumgeschlagen, weil weder die Entwickler noch der IT-Manager (der die Etags fordert) die Anwendungsfälle vollständig erklären können. Vielen Dank! –

+52

Meine Arbeit hier ist erledigt. :) –

+8

Sie sollten auch überprüfen, ob Sie Cache-Control statt Expires verwenden sollten. Mein Verständnis ist, dass Cache-Control nach Expires eingeführt wurde und Ihnen mehr Kontrolle gibt. Siehe http://stackoverflow.com/questions/5799906/whats-the-difference-between- expires-and-cache-control-headers –

19

Standardmäßig erzeugt Apache ein Etag based on die Inode-Nummer der Datei, Datum der letzten Änderung, und Größe, die vollkommen in Ordnung sein sollte, um zu tun, was Sie wollen. Ich denke, es wird auch standardmäßig eine Last-Modified-Kopfzeile basierend auf der letzten Änderungszeit der Datei auf der Festplatte generieren, was auch vollkommen in Ordnung ist, um das zu tun, was Sie wollen.

Sie sollten Apache wahrscheinlich auch einen Expires-Header senden, der ein Jahr in der Zukunft liegt (gemäß http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21), damit Browser wissen, dass der Inhalt cachefähig ist. Werfen Sie einen Blick auf mod_expires, um das zu konfigurieren.

+0

Also das ETag wird die letzte geändert haben und die abgelaufene Header wird sagen, ich will es zu cachen Wenn ich meine Datei hochlade und überschreibe, wird sie einfach wieder in den Cache des Benutzers gezogen, sonst würde ein 304 erzeugt werden, oder? – GeoffreyF67

+0

Das Etag hängt am letzten Änderungsdatum in komplizierter Weise 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. –

+5

Wird die ein Jahr ablaufende Kopfzeile nicht dem Kunden sagen, nicht einmal nach einer neuen Version für ein Jahr zu suchen? –

97

Etag und Zuletzt geändert Header sind Validatoren.

Sie helfen dem Browser und/oder dem Cache (Reverseproxy) zu verstehen, ob sich eine Datei/Seite geändert hat, auch wenn sie den gleichen Namen behält.

Verfällt und Cache-control geben refresh Informationen.

Das bedeutet, dass sie den Browser und die umgekehrten Proxies informieren, bis zu welcher Zeit oder für wie lange sie die Seite/Datei im Cache behalten.

Also die Frage ist in der Regel, welche Validierer zu verwenden, Etag oder last-modified, und welche Aktualisierung Infomation Header zu verwenden, abläuft oder Cache-Kontrolle.

26

Expires und Cache-Control sind „starke Caching-Header“

Last-Modified und ETag „schwache Caching-Header“ sind

Zuerst wird der Browsercheck Expires/Cache-Control, um zu bestimmen, ob eine Anfrage an den Server

machen

Wenn Sie eine Anfrage stellen müssen, sendet es Last-Modified/ETag in der HTTP-Anfrage. Wenn der Etag Wert des Dokuments das entspricht, sendet der Server einen 304-Code statt 200 und keinen Inhalt. Der Browser lädt den Inhalt aus seinem Cache.

+0

Findest du irgendein Dokument, das das "starke und schwache" Caching-Verhalten unterstützt? Ich konnte keinen finden, und mein client browser priorisiert jetzt letztens über ablaufen läuft eigentlich, was ich nicht verstehe warum. – GMsoF

+1

@GMsoF Sie möchten vielleicht einen Blick darauf werfen: http://tools.ietf.org/html/rfc7232#section-2.1 – Medeiros

+0

Also, wenn ich sicherstellen möchte, dass meine Änderungen sofort an den Client weitergegeben werden, aber immer noch etwas Caching nutzen, kann ich nur Last-Modified und ETag richtig nutzen? –

10

Eine weitere Zusammenfassung:

Sie müssen beide verwenden. ETags sind eine "serverseitige" Information. Ablauf ist ein "Client Side" Caching.

  • Verwenden ETags außer wenn Sie einen Lastenausgleich Server. Sie sind sicher und lassen die Kunden wissen, dass sie jedes Mal, wenn Sie etwas auf Ihrer Seite ändern, neue Versionen Ihrer Serverdateien erhalten sollten.

  • Verfällt müssen mit Vorsicht verwendet werden, als ob Sie ein Verfallsdatum weit in der Zukunft wollen aber immediatelly eine der Dateien ändern (eine JS-Datei zum Beispiel), einige Benutzer nicht die modifizierte Version bekommen kann bis lange Zeit!

+0

Im Falle dieser Expires-Situation müssen Sie Ihre js umbenennen und in Ihrem HTML ändern, und hoffen, dass Sie die HTML-Datei auch nicht auf 1 Jahr gesetzt haben. – EralpB

0

Eine weitere Sache Ich mag wäre zu erwähnen, dass einige der Antworten verpasst haben ist der Nachteil, sowohl ETags zu haben und Expires/Cache-control in Ihrem Header.

Je nach Ihren Anforderungen kann es nur zusätzliche Bytes in Ihren Headern hinzufügen, die Pakete erhöhen können, was mehr TCP-Overhead bedeutet. Auch hier sollten Sie sehen, ob der Aufwand für die Verwendung beider Elemente in Ihren Headern erforderlich ist, oder ob Sie Ihren Anforderungen nur zusätzliches Gewicht hinzufügen, wodurch sich die Leistung verringert.

Sie können weitere Informationen zu dieser ausgezeichneten Blog-Post von Kyle Simpson lesen: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1

Meiner Ansicht Mit Kopf Ablaufen, Server dem Client sagen können, wenn meine Daten abgestanden sein würden, während mit Etag, Server würde Überprüfen Sie den Etag-Wert für den Client für jede Anfrage.

Verwandte Themen