Открыть сервис

HTTP-статус 304 Not Modified

304 Not Modified — это HTTP-статус ответа сервера, который относится к группе перенаправлений (3xx) и указывает, что запрошенный ресурс не изменился с момента последнего обращения клиента. В отличие от других кодов этой группы, 304 не приводит к фактическому перенаправлению на другой URL, а сообщает клиенту, что его локальная копия ресурса (например, в кэше браузера) является актуальной и может быть использована без повторной загрузки данных с сервера. Статус 304 является частью механизма условных запросов, определённого в спецификации HTTP/1.1 (RFC 7232).

История и стандартизация

Код состояния 304 был впервые описан в спецификации HTTP/1.0 (RFC 1945, 1996 год) как часть механизма кэширования. Впоследствии он был уточнён в RFC 2616 (HTTP/1.1, 1999 год) и окончательно стандартизирован в RFC 7232 («Conditional Requests», 2014 год), который заменил соответствующие разделы предыдущих версий. В современной спецификации HTTP, описанной в RFC 9110 (2022 год), статус 304 сохранил своё значение и механизм использования.

Принцип работы

Статус 304 является ответом на условный запрос. Условный запрос — это HTTP-запрос, содержащий заголовки, которые позволяют серверу проверить, изменился ли ресурс с момента последнего получения клиентом. Основные заголовки для условных запросов:

  • If-Modified-Since — клиент указывает дату и время, когда он в последний раз получил ресурс (например, If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT). Сервер сравнивает эту дату с датой последнего изменения ресурса. Если ресурс не изменялся, сервер возвращает 304.
  • If-None-Match — клиент указывает ETag (entity tag) — уникальный идентификатор версии ресурса (например, If-None-Match: "686897696a7c876b7e"). Сервер сравнивает ETag с текущим значением. Если они совпадают, ресурс не изменился, и сервер возвращает 304.

Если сервер определяет, что ресурс изменился, он возвращает полный ответ с кодом 200 OK и новыми данными. Если же изменений нет, сервер отправляет ответ 304 без тела сообщения (body), что экономит трафик и время загрузки.

Формат ответа

Ответ 304 Not Modified имеет следующие характеристики:

  • Строка состояния: HTTP/1.1 304 Not Modified (или соответствующая версия HTTP/2, HTTP/3).
  • Заголовки: Сервер может включать заголовки, которые обновляют кэшированную информацию, например:
  • Cache-Control — указания по кэшированию.
  • Expiresдата истечения срока действия кэша.
  • Date — текущая дата и время на сервере.
  • ETag — новый ETag, если он изменился (хотя сам ресурс не изменился, ETag может быть обновлён по другим причинам).
  • Last-Modified — дата последнего изменения (обычно не меняется, если ресурс не изменился).
  • Тело ответа: Отсутствует. Сервер не передаёт содержимое ресурса, так как клиент уже имеет актуальную копию.

Применение

Статус 304 широко используется в веб-технологиях для оптимизации загрузки страниц и снижения нагрузки на серверы. Основные сценарии применения:

  • Кэширование в браузерах: Браузеры автоматически отправляют условные запросы для ресурсов, которые были загружены ранее (изображения, CSS-файлы, JavaScript-файлы, шрифты). Если сервер возвращает 304, браузер использует локальную копию, что ускоряет загрузку страницы.
  • Прокси-серверы и CDN: Прокси-серверы и сети доставки контента (CDN) используют условные запросы для проверки актуальности кэшированных данных. При получении 304 они обслуживают запрос из своего кэша.
  • API и веб-сервисы: Некоторые REST API поддерживают условные запросы для оптимизации передачи данных. Например, при запросе списка объектов клиент может указать ETag, и сервер вернёт 304, если список не изменился.
  • Поисковые роботы: Поисковые системы, такие как Яндекс и Google, используют условные запросы для проверки актуальности проиндексированных страниц, что снижает нагрузку на серверы.

Преимущества и недостатки

Преимущества

  • Экономия трафика: Ответ 304 не содержит тела, что значительно уменьшает объём передаваемых данных, особенно для больших файлов (изображения, видео).
  • Снижение нагрузки на сервер: Серверу не нужно генерировать и передавать полный ответ, что экономит процессорное время и пропускную способность.
  • Ускорение загрузки: Клиент (браузер) получает подтверждение актуальности кэша быстрее, чем полный ответ, что ускоряет отображение страницы.

Недостатки

  • Дополнительные запросы: Для каждого ресурса, который может быть в кэше, клиент отправляет отдельный условный запрос. Это увеличивает количество HTTP-запросов, хотя и с малым объёмом данных.
  • Сложность реализации: Сервер должен правильно поддерживать заголовки Last-Modified и ETag, а также корректно обрабатывать условные запросы. Ошибки могут привести к неверному кэшированию (например, когда сервер возвращает 304, хотя ресурс изменился).
  • Зависимость от точности времени: При использовании If-Modified-Since точность зависит от синхронизации часов сервера и клиента. Разница во времени может привести к ложным срабатываниям.

Пример работы

Рассмотрим типичный сценарий:

  1. Первый запрос: Браузер запрашивает изображение logo.png с сервера.
  • Запрос: GET /logo.png HTTP/1.1
  • Ответ: HTTP/1.1 200 OK, заголовки Last-Modified: Mon, 01 Jan 2024 12:00:00 GMT, ETag: "abc123", тело — данные изображения.
  1. Второй запрос (условный): При повторном посещении страницы браузер отправляет условный запрос.
  • Запрос: GET /logo.png HTTP/1.1, заголовки If-Modified-Since: Mon, 01 Jan 2024 12:00:00 GMT и If-None-Match: "abc123".
  • Ответ (если изображение не изменилось): HTTP/1.1 304 Not Modified, заголовки Date: Tue, 02 Jan 2024 10:00:00 GMT, тело отсутствует.
  1. Результат: Браузер использует кэшированную копию изображения.

Отличие от других кодов 3xx

  • 301 Moved Permanently и 302 Found: Указывают на постоянное или временное перенаправление на другой URL. Клиент должен выполнить новый запрос по указанному адресу.
  • 303 See Other: Перенаправляет клиента на другой ресурс с использованием метода GET (часто используется после POST-запросов).
  • 304 Not Modified: Не является перенаправлением в классическом смысле. Клиент не меняет URL, а просто использует кэшированную копию.
  • 307 Temporary Redirect и 308 Permanent Redirect: Перенаправления с сохранением метода запроса (например, POST остаётся POST).

Безопасность и ограничения

Статус 304 не несёт прямых угроз безопасности, но его использование может быть ограничено в некоторых контекстах:

  • Аутентификация: Если ресурс требует аутентификации, условные запросы должны обрабатываться с учётом прав доступа. Сервер может вернуть 304 только для авторизованных пользователей, иначе — 401 Unauthorized.
  • Динамические ресурсы: Для динамически генерируемых страниц (например, с персональными данными) использование 304 может быть затруднено, так как контент может меняться для каждого пользователя. В таких случаях сервер может не поддерживать условные запросы или возвращать 200 OK с полным ответом.
  • Кэширование прокси: Прокси-серверы могут кэшировать ответы 304, что может привести к некорректной работе, если прокси не учитывает контекст запроса (например, авторизацию).

Источники

  • RFC 7232 — Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests (2014)
  • RFC 9110 — HTTP Semantics (2022)
  • RFC 1945 — Hypertext Transfer Protocol — HTTP/1.0 (1996)
  • «HTTP: The Definitive Guide» by David Gourley and Brian Totty (2002)
  • Документация MDN Web Docs: «304 Not Modified»

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →