ETag
Der ETag
(oder Entity-Tag) HTTP-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 keine vollständige Antwort erneut senden muss, wenn sich der Inhalt nicht geändert hat. Zudem helfen Etags dabei, gleichzeitige Aktualisierungen einer Ressource zu verhindern, die sich gegenseitig überschreiben ("mid-air collisions").
Wenn sich die Ressource unter einer bestimmten URL ändert, muss ein neuer Etag
-Wert generiert werden. Ein Vergleich von ihnen kann bestimmen, ob zwei Repräsentationen einer Ressource identisch sind.
Header-Typ | Antwort-Header |
---|---|
Verbotener Header-Name | nein |
Syntax
ETag: W/"<etag_value>"
ETag: "<etag_value>"
Direktiven
W/
Optional-
'W/'
(Groß-/Kleinschreibung beachten) zeigt an, dass ein schwacher Validator verwendet wird. Schwache Etags sind einfach zu erzeugen, aber für Vergleiche weit weniger nützlich. Starke Validatoren sind ideal für Vergleiche, können jedoch sehr schwer effizient zu erzeugen sein. SchwacheETag
-Werte von zwei Repräsentationen derselben Ressourcen könnten semantisch äquivalent sein, aber nicht byteweise identisch. Das bedeutet, dass schwache Etags das Caching verhindern, wenn Bytebereich-Anfragen verwendet werden, jedoch starke Etags ermöglichen es, dass Bereichsanfragen weiterhin zwischengespeichert werden. - "<etag_value>"
-
Entity-Tag, das die angeforderte Ressource eindeutig darstellt. Es ist eine Zeichenkette von 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 Änderungszeitpunktes oder nur eine Revisionsnummer. Beispielsweise kann eine Wiki-Engine einen hexadezimalen Hash des Inhalts des Dokumentartikels verwenden.
Beispiele
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
Vermeidung von "mid-air collisions"
Mit Hilfe der ETag
- und If-Match
-Header können Sie Bearbeitungskollisionen in der Luft 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 der Änderungen an einer Wiki-Seite (Senden 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 Hash-Werte nicht übereinstimmen, bedeutet dies, dass das Dokument zwischenzeitlich bearbeitet wurde und ein 412 Precondition Failed
-Fehler ausgelöst wird.
Zwischenspeicherung unveränderter Ressourcen
Eine weitere typische Verwendung des ETag
-Headers besteht darin, Ressourcen, die sich nicht geändert haben, zwischenzuspeichern. Wenn ein Benutzer eine bestimmte URL erneut besucht (die einen ETag
gesetzt hat), und sie veraltet ist (zu alt, um als nutzbar angesehen zu werden), sendet der Client den Wert seines ETag
im If-None-Match
-Headerfeld mit:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Der Server vergleicht das ETag
des Clients (gesendet mit If-None-Match
) mit dem ETag
für die aktuelle Version der Ressource. Wenn beide Werte übereinstimmen (das heißt, die Ressource hat sich nicht geändert), sendet der Server den Status 304
Not Modified
ohne Inhalt zurück, was dem Client mitteilt, dass die zwischengespeicherte Version der Antwort weiterhin gut nutzbar (frisch) ist.
Spezifikationen
Specification |
---|
HTTP Semantics # field.etag |
Browser-Kompatibilität
BCD tables only load in the browser