En-tête ETag
Baseline
Widely available
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis juillet 2015.
L'en-tête de réponse HTTP ETag (balise d'entité) est un identifiant pour une version spécifique d'une ressource.
Il permet aux caches d'être plus efficaces et d'économiser de la bande passante, car un serveur web n'a pas besoin de renvoyer une réponse complète si le contenu n'a pas changé.
De plus, les ETag aident à éviter que des mises à jour simultanées d'une ressource ne s'écrasent mutuellement (« collisions en vol »).
Si la ressource à une URL donnée change, une nouvelle valeur ETag doit être générée.
Une comparaison de ces valeurs permet de déterminer si deux représentations d'une ressource sont identiques.
| Type d'en-tête | En-tête de réponse, En-tête de représentation |
|---|---|
| En-tête de requête interdit | Non |
Syntaxe
ETag: W/"<etag_value>"
ETag: "<etag_value>"
Directives
W/Facultatif-
'W/'(sensible à la casse) indique qu'un validateur faible est utilisé. Les validateurs faibles sont faciles à générer, mais ils sont beaucoup moins utiles pour les comparaisons. Les validateurs forts sont idéaux pour les comparaisons, mais ils peuvent être très difficiles à générer efficacement. Les valeursEtagfaibles de deux représentations des mêmes ressources peuvent être sémantiquement équivalentes, mais ne pas être identiques octet par octet. Cela signifie que les ETag faibles empêchent la mise en cache lorsque des requêtes de plages d'octets sont utilisées, mais les ETag forts permettent toujours la mise en cache des requêtes de plage. <etag_value>-
Balises d'entité représentant d'une façon unique les ressources demandées. Elles sont consituées d'une chaîne de caractères ASCII placés entre apostrophes doubles (comme
"675af34563dc-tr34"). La méthode par laquelle les valeursETagsont générées n'est pas définie. Souvent, un hachage du contenu, un hachage de l'horodatage de la dernière modification, ou seulement un numéro de révision est utilisé. Par exemple, MDN utilise un hachage de chiffres hexadécimaux du contenu du wiki.
Exemples
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
Évitement des collisions en vol
A l'aide des en-têtes ETag et If-Match, vous pouvez détecter les collisions d'édition en vol (conflits).
Par exemple, lors de l'édition de MDN, le contenu actuel du wiki est haché et placé dans un Etag dans la réponse :
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Lors de la sauvegarde des modifications d'une page wiki ("post" des données), la requête POST contiendra l'en-tête If-Match contenant les valeurs ETag par rapport auxquelles vérifier la péremption.
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Si les hachages ne correspondent pas, cela signifie que le document a été modifié entre-temps, et une erreur 412 Precondition Failed est déclenchée.
Mise en cache des ressources inchangées
Un autre cas d'utilisation typique de l'en-tête ETag est de mettre en cache les ressources qui sont inchangées.
Si un utilisateur visite à nouveau une URL donnée (qui a un ensemble d'ETag), et qu'elle est périmée, c'est à dire, trop ancienne pour être considérée comme utilisable, le client enverra en même temps la valeur de son ETag dans un champ d'en-tête If-None-Match :
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Le serveur comparera l'ETag du client (envoyé avec If-None-Match) à l'ETag de sa version en cours de la ressource, et si les deux valeurs correspondent (c'est-à-dire que la ressource n'a pas changé), le serveur renverra un statut 304 Not Modified, sans aucun corps, qui indiquera au client que sa version mise en cache de la réponse est toujours bonne à utiliser (actuelle).
Spécifications
| Specification |
|---|
| HTTP Semantics> # field.etag> |
Compatibilité des navigateurs
Voir aussi
- Les en-têtes
If-Match,If-None-Match - Les codes de statut de réponse
304 Not Modified,412 Precondition Failed - Note W3C : Édition du Web — Détecter le problème de mise à jour perdue avec la réservation non exclusive (angl.)