Собираю знания, необходимые для «понимания клиент-серверной архитектуры 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 указывает клиенту и промежуточными прокси надо ли обращаться к серверу за обновлённым файлом до указанной даты.