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точность зависит от синхронизации часов сервера и клиента. Разница во времени может привести к ложным срабатываниям.
Пример работы
Рассмотрим типичный сценарий:
- Первый запрос: Браузер запрашивает изображение
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", тело — данные изображения.
- Второй запрос (условный): При повторном посещении страницы браузер отправляет условный запрос.
- Запрос:
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, тело отсутствует.
- Результат: Браузер использует кэшированную копию изображения.
Отличие от других кодов 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 →