Настройка ETags

В статье "Configure ETags" автор рекомендует отключать 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