ETag и Last-Modified: кто из них решает
Когда срок свежести ответа истёк, клиент не обязан скачивать его заново. Он может спросить сервер: «у меня есть вот такая версия — она ещё актуальна?» Это условный запрос, и для него нужен валидатор.
Два валидатора
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 на них должен совпадать. Иначе каждый второй условный запрос будет промахиваться и возвращать полный ответ.