Конспекты по сетям

ETag и Last-Modified: кто из них решает

HTTP · кэширование

Когда срок свежести ответа истёк, клиент не обязан скачивать его заново. Он может спросить сервер: «у меня есть вот такая версия — она ещё актуальна?» Это условный запрос, и для него нужен валидатор.

Два валидатора

Last-Modified — время последнего изменения с точностью до секунды. Клиент повторяет его в If-Modified-Since.

ETag — непрозрачная метка версии. Клиент повторяет её в If-None-Match.

GET /styles.css HTTP/1.1
If-None-Match: "5f1c-62a8"
If-Modified-Since: Tue, 03 Sep 2024 10:12:40 GMT

HTTP/1.1 304 Not Modified
ETag: "5f1c-62a8"

Если пришли оба

Сервер, получивший If-None-Match, должен ориентироваться на него и игнорировать If-Modified-Since. ETag точнее: файл может измениться дважды за секунду, а время изменения — остаться прежним после пересборки.

Слабые метки

Префикс W/ означает «семантически то же самое», а не «байт в байт». Для обычной проверки свежести этого достаточно; для запросов диапазонов (Range) — нет, там нужна сильная метка.

Что проверить у себя

Если за балансировщиком несколько серверов, ETag на них должен совпадать. Иначе каждый второй условный запрос будет промахиваться и возвращать полный ответ.

Первоисточник: RFC 9110, разделы 8.8 и 13; RFC 9111.