Настройка ETags
Теги объектов (ETags) представляют собой механизм, который используют веб-серверы и браузеры для определения соответствия компонента в кэше браузера компоненту на сервере. (Слово "объект" является синонимом к слову "компонент": изображения, скрипты, таблицы стилей и т.д.) ETags были добавлены в качестве механизма для проверки актуальности объектов. Этот метод является более гибким, нежели проверка по дате последнего изменения. ETag - это строка, которая идентифицирует конкретную версию компонента. Единственным ограничением будет то, что строка должна быть взята в кавычки. Основной сервер определяет ETag компонента, используя заголовок ETag
.
HTTP/1.1 200 OK Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT ETag: "10c24bc-4ab-457e1c1f" Content-Length: 12195
Затем, если браузеру необходимо подтвердить актуальность компонента, то он использует заголовок If-None-Match
, чтобы передать ETag обратно на основной сервер. Если ETags совпадают, то возвращается ответ с кодом статуса 304, сократив объём на 12195 байт, как указано в этом примере.
GET /i/yahoo.gif HTTP/1.1 Host: us.yimg.com If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT If-None-Match: "10c24bc-4ab-457e1c1f" HTTP/1.1 304 Not Modified
Проблема с ETags состоит в том, что они обычно пишутся с использованием атрибутов, которые делают их специфичными для конкретного сервера. ETags не будут совпадать, если браузер получает оригинальный компонент с одного сервера, а затем пытается проверить его актуальность на другом сервере, такая ситуация часто встречается на сайтах, которые используют кластер для обработки запросов. По умолчанию, и Apache и IIS включают в ETag данные, которые резко снижают шансы точности последующих проверок на актуальность на веб-сайтах с несколькими серверами.
Apache 1.3 и 2.x создают ETag в формате inode-size-timestamp
. Хотя данный файл может находиться в одной и той же директории на нескольких серверах, и иметь тот же размер, права, время и т.д., но его инод (inode) на разных серверах разный.
IIS 5.0 и 6.0 имеют похожую проблему, форматом ETags которых является Filetimestamp:ChangeNumber
. ChangeNumber
это счётчик, использующийся для отслеживания изменений в конфигурации IIS. Маловероятно, что ChangeNumber
одинаков на всех IIS-серверах веб-сайта.
Как результат, ETags, сгенерированные Apache и IIS для одного и того же компонента, будут разными на разных серверах. Если ETags не совпадают, пользователь не получает быстрого ответа 304, для этого они и были разработаны; вместо этого, они получат стандартный ответ 200 со всеми данными для компонента. Если Вы размещаете свой сайт только на одном сервере, то у Вас не будет никаких проблем. А вот если Вы размещаетесь на нескольких серверах, и используете Apache или IIS, устанавливающие ETag согласно настройкам по умолчанию, то у ваших пользователей страницы будут загружаться медленнее, ваши серверы будут иметь более высокую нагрузку, Вы будете потреблять больше трафика, и прокси не будут эффективно кэшировать ваш контент. Даже если Ваши компоненты будут иметь заголовок Expires
настроенный на далёкое будущее, Вы всё равно будете получать условный GET-запрос, всякий раз, как пользователь будет нажимать на кнопки "Перезагрузить" или "Обновить".
Если Вы не пользуетесь преимуществами, которые предоставляют ETags, то лучше просто отключить их вообще. Заголовок Last-Modified
проверяет актуальность компонента, основываясь на timestamp. Отключение ETag уменьшает размер HTTP-заголовков, как ответов, так и запросов. Вот статья, описывающая, как отключить ETags. В Apache это можно сделать просто, добавив следующую строку в файл конфигурации:
FileETag none
Примечание технического редактора: на серверах виртуального хостинга КОМТЕТ установлен Apache, ETags не используются.
Оригинал статьи на developer.yahoo.com
Перевод КОМТЕТ komtet.ru