Что это значит
Кэшированная копия у клиента всё ещё актуальна, поэтому сервер не отправляет тело. Это ответ на условный запрос с If-None-Match или If-Modified-Since.
Типичные причины
- ETag в If-None-Match совпадает с текущей версией
- Ресурс не менялся с момента If-Modified-Since
- Браузер перепроверяет закэшированный ресурс
Как исправить
Если вы клиент или посетитель
Используйте тело из кэша. Если содержимое выглядит устаревшим, валидатор может быть неверным; сделайте принудительное обновление или проверьте генерацию ETag.
Если вы владелец сайта или API
Генерируйте стабильные ETag (одинаковые на всех серверах за балансировщиком) и отправляйте те же заголовки кэширования, что и с 200.
Пример ответа
HTTP/1.1 304 Not Modified
Date: Tue, 07 Oct 2025 09:30:00 GMT
Server: nginx
ETag: "33a64df5"
Cache-Control: max-age=3600 Спецификация
Частые вопросы
› 304 — это ошибка?
Нет. Он экономит трафик, сообщая клиенту, что кэш актуален.
› Почему после деплоя пользователи видят старые файлы?
Заголовки кэширования допускают устаревшие копии. Для статики используйте имена файлов с хешем, а для HTML — короткий max-age с перепроверкой.