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
-(Antwort-Header) ist ein Identifikator 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.
Zusätzlich helfen ETags, gleichzeitige Aktualisierungen einer Ressource zu verhindern, die sich gegenseitig überschreiben ("mid-air collisions").
Wenn sich die Ressource an einer gegebenen URL ändert, muss ein neuer ETag
-Wert generiert werden.
Ein Vergleich dieser kann bestimmen, ob zwei Darstellungen einer Ressource identisch sind.
Header-Typ | Antwort-Header, Repräsentations-Header |
---|---|
Verbotener Anfrage-Header | Nein |
Syntax
ETag: W/"<etag_value>"
ETag: "<etag_value>"
Direktiven
W/
Optional-
W/
(Groß- und Kleinschreibung beachten) zeigt an, dass ein schwacher Validator verwendet wird. Schwache ETags sind einfach zu generieren, aber bei Vergleichen weit weniger nützlich. Starke Validatoren sind ideal für Vergleiche, können aber sehr schwer effizient zu generieren sein. SchwacheETag
-Werte von zwei Darstellungen derselben Ressourcen könnten semantisch gleichwertig, aber nicht byteweise identisch sein. Das bedeutet, dass schwache ETags das Caching verhindern, wenn Byte-Range-Anfragen verwendet werden, während starke ETags bedeuten, dass Bereichsanfragen immer noch gecacht werden können. <etag_value>
-
Entität-Tag, das die angeforderte Ressource eindeutig darstellt. Es handelt sich um eine Zeichenkette aus ASCII-Zeichen, die in Anführungszeichen stehen, wie z.B.
"675af34563dc-tr34"
. Die Methode zur Generierung vonETag
-Werten ist nicht spezifiziert. Typischerweise ist der ETag-Wert ein Hash des Inhalts, ein Hash des letzten Änderungszeitpunkts oder einfach eine Versionsnummer. Ein Beispiel ist eine Wiki-Engine, die einen hexadezimalen Hash des Inhalts des Dokumentationsartikels verwenden kann.
Beispiele
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
Vermeidung von Kollisionen bei simultanen Bearbeitungen
Mit Hilfe der ETag
- und If-Match
-Header können Sie Kollisionen bei simultanen Bearbeitungen (Konflikte) erkennen.
Zum Beispiel kann beim Bearbeiten eines Wikis der aktuelle Wiki-Inhalt gehasht und in einem ETag
-Header in der Antwort gespeichert werden:
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Beim Speichern von Änderungen an einer Wiki-Seite (Daten werden gesendet) 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 zwischenzeitlich bearbeitet wurde, und ein 412 Precondition Failed
-Fehler wird ausgelöst.
Caching von unveränderten Ressourcen
Ein weiterer typischer Gebrauch des ETag
-Headers ist das Caching von unveränderten Ressourcen.
Wenn ein Benutzer eine bestimmte URL erneut besucht (die einen ETag
gesetzt hat) und sie veraltet ist (zu alt, um als verwendbar betrachtet zu werden), wird der Client den Wert seines ETag
zusammen mit einem If-None-Match
-Headerfeld senden:
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Der Server vergleicht das ETag
des Clients (gesendet mit If-None-Match
) mit dem ETag
für seine aktuelle Version der Ressource, und wenn beide Werte übereinstimmen (d.h. die Ressource hat sich nicht geändert), sendet der Server einen 304 Not Modified
-Status ohne Body zurück, was dem Client mitteilt, dass die zwischengespeicherte Version der Antwort noch gut zu verwenden ist (fresh).
Spezifikationen
Specification |
---|
HTTP Semantics # field.etag |