Павел Новицкий

Нерегулярные заметки

ETag vs Expires

8 сентября 2014, 21:46

Собираю знания, необходимые для «понимания клиент-серверной архитектуры HTTP протокола».

Умные дядьки в статьях по оптимизации советуют сокращать количество HTTP-запросов к элементам на странице. Основным инструментом для сего благого действия называют заголовки ETag (Entity Tag) и Expires. И как-то так получилось, что везде подробно объясняется принцип работы загловка Expires, а связка Last-Modified + If-Modified-Since и ETag добавляются как «ещё один параметр, который поможет контролировать кэширование элементов».

Etag и Last-modified — заголовки-валидаторы. Они помогают клиенту понять изменилось ли содержимое конкретного документа/файла со времени последнего посещения.

Первое посещение

запрос:
GET /style.css HTTP/1.1

ответ:
HTTP/1.1 200 OK
Last-Modified: Fri, 5 Sep 2014 09:27:36 GMT


Повторное посещение

запрос:
GET /style.css HTTP/1.1
If-Modified-Since:Mon, 08 Sep 2014 07:11:55 GMT

ответ:
HTTP/1.1 304 Not Modified
Первое посещение

запрос:
GET /style.css HTTP/1.1

ответ:
HTTP/1.1 200 OK
Etag: ddaabb3a2afd8d40


Повторное посещение

запрос:
GET /style.css HTTP/1.1
If-None-Match: ddaabb3a2afd8d40

ответ:
HTTP/1.1 304 Not Modified

В обоих случаях при повторном обращении браузер получает сообщение 304 Not Modified и не скачивает файл заново, а берёт старый из кэша.

Рекомендуется по возможности использовать совместно оба заголовка: ETag и Last-modified. Etag рассматривается как «сильный» валидатор (изменение значения влечёт за собой изменение связных валидаторов). Валидатор, чьё значение может не измениться при изменении документа, называется «слабым». В идеале, стоит посылать оба заголовка. Но совершенно свободно можно использовать Last-modified для часто изменяемых документов, а для статических и редко изменяющихся файлов — Etag.

Expires и Cache-control — заголовки, сообщающие о необходимости обновить документ. С помощью этих заголовков браузеры и промежуточные прокси узнают на какой срок можно сохранить документ в кэше.

Etag сам по себе не может сказать клиенту нужно ли запрашивать обновлённый файл снова при следующем посещении. Если основываться только на ETag, то клиент всегда будет вынужден делать запрос к серверу для уточнения ситуации. Сервер, основываясь на ETag из If-None-Match, принимает решение отправлять клиенту файл (200 OK) или разрешить использовать локальную копию (304 Not Modified). ETag по сути — это контрольная сумма документа, изменяющаяся при изменении содержимого самого документа.

Заголовок Expires указывает клиенту и промежуточными прокси надо ли обращаться к серверу за обновлённым файлом до указанной даты.

Вконтакте
0 комментариев


Ваш комментарий
(обязательно)
(не показывается)
(HTML не работает)
© 2013-2024