ETag

 

Заголовок HTTP ответа ETag является идентификатором специфической версии ресурса. Он позволяет более эффективно использовать кеш и сохраняет пропускную способность, позволяя серверу отправлять не весь ответ, если содержимое не изменилось. С другой стороны, если контент все-так поменялся, Etag помогает предотвратить одновременное обновление ресурса от перезаписи друг друга ("воздушная коллизия").

Если ресурс по заданному URL изменился, будет сгенерированно новое значение Etag. Поэтому Etag чем-то похож на отпечаток ("fingerprints") и может также быть использован для отслеживания предназначения некоторых серверов. Сравнение этих заголовков позволяет быстро определить являются ли два представления ресурса одними и теме же. Отслеживаемый сервер также может задать сохранять их постоянно.

Тип заголовка Заголовок ответа
Запрещенное имя заголовка нет

Синтаксис

ETag: W/"<etag_value>"
ETag: "<etag_value>"

Директивы

W/ Необязательный
'W/' (чувствителен к регистру) указывает, что используется слабый валидатор. Слабые валидаторы легко сгенерировать, но они намного реже используются для сравнения. Сильные валидаторы идеальны для сравнения, но их может быть очень сложно сгенерировать эффективно. Слабое значение Etag двух представлений одного и того же ресурса может быть семантически одинаково, но не байт-в-байт.
"<etag_value>"
Тэг сущности, уникально представляющий запрашиваемый ресурс. Это строка ASCII кодов, заключенная в двойные кавычки (например, "675af34563dc-tr34"). Метод, по которому генерируются значения ETag, не определен. Обычно, используется хэш контента, хэш последнего времени модификации или просто номер ревизии. Например, MDN использует шестнадцатиричных хэш wiki-содержимого.

Примеры

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"

Как избежать коллизий в процессе работы приложения

С помощью заголовков ETag и If-Match, существует возможность обнаружить коллизии в процессе работы приложения.

Например, при редактировании MDN, текущее содержимое статьи захэшировано и помещено в ответ при помощи заголовока Etag:

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

При сохранении изменений в статье (данные отправляются), POST запрос будет содержать заголовок If-Match, значение которого эквивалетно значению ETag. Это позволяет проверить актуальность данных.

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Если хэши из заголовков не совпадают, это означает что данные уже были изменены между запросами (in-between) и будет возвращена ошибка 412 Precondition Failed.

Кэширование неизменямых ресурсов

Другая типичная ситуация для использования ETag — кэширование ресурсов, которые не будут изменяться. Если пользовать повторно посещает URL-адрес (с утановленным заголовком ETag), и при этом данные слишком устарели и не могут быть использованы. Тогда клиент отправит значение ETag внутри заголовка If-None-Match:

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

После чего сервер сравнит клиентский ETag (отправленный с помощью If-None-Match) с ETag для текущей версии ресурса и если их значения совпадают (т.е. ресурсы не были изменены), сервер вернет статус 304 Not Modified, без тела ответа. Такой ответ сообщает клиенту что закэшированная версия ресурса актуальна и готова к использованию.

Specifications

Specification Title
RFC 7232, секция 2.3: ETag Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests

Browser compatibility

Update compatibility data on GitHub
КомпьютерыМобильные
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung Internet
ETagChrome Полная поддержка ДаEdge Полная поддержка ДаFirefox Полная поддержка ДаIE Полная поддержка ДаOpera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка ДаChrome Android Полная поддержка ДаFirefox Android Полная поддержка ДаOpera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка

See also