ETag header
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Der HTTP ETag
(Entity-Tag) Antwort-Header ist ein Bezeichner für eine spezifische Version einer Ressource.
Er ermöglicht es Caches, effizienter zu arbeiten und Bandbreite zu sparen, da ein Webserver nicht die gesamte Antwort erneut senden muss, wenn sich der Inhalt nicht geändert hat.
Zusätzlich helfen ETags dabei, gleichzeitige Aktualisierungen einer Ressource zu verhindern, die einander überschreiben könnten ("mid-air collisions").
Wenn sich die Ressource an einer bestimmten URL ändert, muss ein neuer Etag
-Wert generiert werden.
Ein Vergleich dieser Werte kann bestimmen, ob zwei Darstellungen einer Ressource identisch sind.
Header-Typ | Antwort-Header, Darstellungs-Header |
---|---|
Verbotener Anfrage-Header | Nein |
Syntax
ETag: W/"<etag_value>"
ETag: "<etag_value>"
Direktiven
W/
Optional-
W/
(groß-/kleinschreibungssensitiv) zeigt an, dass ein schwacher Validator verwendet wird. Schwache ETags sind einfach zu erzeugen, aber weit weniger nützlich für Vergleiche. Starke Validatoren sind ideal für Vergleiche, können aber sehr schwer effizient generiert werden. SchwacheETag
-Werte von zwei Darstellungen derselben Ressourcen könnten semantisch äquivalent, aber nicht byte-genau identisch sein. Das bedeutet, dass schwache ETags das Caching verhindern, wenn Bytebereichs-Anfragen genutzt werden, während starke ETags bedeuten, dass Bereichsanfragen dennoch gecacht werden können. <etag_value>
-
Entity-Tag, das die angeforderte Ressource eindeutig repräsentiert. Es handelt sich um eine Zeichenfolge aus ASCII-Zeichen, die in Anführungszeichen gesetzt ist, wie
"675af34563dc-tr34"
. Die Methode, mit derETag
-Werte generiert werden, ist nicht spezifiziert. Typischerweise ist der ETag-Wert ein Hash des Inhalts, ein Hash des letzten Änderungszeitstempels oder einfach eine Revisionsnummer. Beispielsweise kann eine Wiki-Engine einen hexadezimalen Hash des Dokumentationsartikelinhalts verwenden.
Beispiele
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
Vermeidung von mid-air collisions
Mit Hilfe der ETag
- und der If-Match
-Header können Sie mid-air Edit-Kollisionen (Konflikte) erkennen.
Zum Beispiel kann beim Bearbeiten eines Wikis der aktuelle Wiki-Inhalt gehasht und in einen Etag
-Header in der Antwort eingefügt werden:
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Beim Speichern von Änderungen an einer Wikiseite (Posten von Daten) enthält die POST
-Anfrage den If-Match
-Header mit den ETag
-Werten, um die Aktualität zu überprüfen.
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Wenn die Hashes nicht übereinstimmen, bedeutet dies, dass das Dokument in der Zwischenzeit bearbeitet wurde und ein 412 Precondition Failed
-Fehler ausgelöst wird.
Caching unveränderter Ressourcen
Eine andere typische Verwendung des ETag
-Headers ist das Caching von unveränderten Ressourcen.
Wenn ein Benutzer eine bestimmte URL erneut besucht (die ein ETag
gesetzt hat) und diese veraltet (zu alt, um noch als verwendbar zu gelten) ist, sendet der Client den Wert seines ETag
zusammen mit einem If-None-Match
Headerfeld:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Der Server vergleicht den ETag
des Clients (gesendet mit If-None-Match
) mit dem ETag
für seine aktuelle Version der Ressource, und wenn beide Werte übereinstimmen (das heißt, die Ressource hat sich nicht geändert), sendet der Server einen 304 Not Modified
-Status zurück, ohne einen Body, was dem Client mitteilt, dass die zwischengespeicherte Version der Antwort noch gut zu verwenden ist (frisch).
Spezifikationen
Specification |
---|
HTTP Semantics # field.etag |