HTTP 304 Not Modified
Валидатор кэша: с момента последнего посещения ничего не изменилось, продолжайте использовать уже имеющуюся копию.
Что означает HTTP 304
HTTP 304 Not Modified — это ответ на условный запрос. Клиент говорит «у меня есть копия от этой даты» (If-Modified-Since) или «с таким отпечатком» (If-None-Match), а сервер подтверждает, что копия по-прежнему актуальна, отвечая 304 без тела.
Этот механизм — ревалидация кэша — делает повторные загрузки страниц быстрыми: браузер заново скачивает только то, что изменилось, а всё остальное обходится одним небольшим round-trip'ом.
Частые причины ответов 304
- Браузер ревалидировал кэшированную страницу, скрипт или изображение, и они не изменились.
- Edge-узел CDN ревалидировал сохранённый объект относительно источника (origin).
- Клиент API использовал ETag'и для дешёвого опроса ресурса.
Хорошие практики для разработчиков
- Отдавайте стабильные заголовки ETag или Last-Modified, чтобы клиенты вообще могли проводить ревалидацию.
- Не включайте тело ответа в 304 — у клиента оно уже точно есть.
- Остерегайтесь ETag'ов, меняющихся при каждом ответе (например, из-за серверов с балансировкой нагрузки и хешами для каждого узла): они незаметно отключают ревалидацию.
Пример ответа
GET /styles.css HTTP/1.1 If-None-Match: "abc123" HTTP/1.1 304 Not Modified ETag: "abc123" Cache-Control: max-age=3600
Влияние на SEO
Ответы 304 полезны для производительности SEO: Googlebot активно использует условные запросы, и корректная ревалидация позволяет ему обходить больше страниц вашего сайта при том же бюджете. Сломанные валидаторы вынуждают полностью перезагружать контент при каждом обходе.
Частые вопросы
Является ли ответ 304 ошибкой?
Нет — это сигнал успеха, означающий, что ваша кэшированная копия всё ещё актуальна. Браузеры обрабатывают его прозрачно.
Что вызывает ответ 304?
Запрос с заголовками If-None-Match или If-Modified-Since, значения которых по-прежнему совпадают с текущим ресурсом.
Почему в DevTools я вижу 304 вместо 200?
У браузера была кэшированная копия, и он её ревалидировал. Статус показывает, что сервер подтвердил кэш вместо повторной отправки файла.