← Назад к вопросам

Какие знаешь заголовки для кэширования?

2.0 Middle🔥 202 комментариев
#Браузер и сетевые технологии

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Заголовки HTTP для кэширования: полный обзор

Кэширование — критически важный механизм для производительности веб-приложений, и HTTP предоставляет богатый набор заголовков для его контроля. Я разделю их на несколько категорий для ясности.

1. Основные заголовки управления кэшем (Cache-Control)

Заголовок Cache-Control — наиболее мощный и современный инструмент. Он может содержать несколько директив:

Директивы для ответа сервера (Response):

Cache-Control: public, max-age=3600, s-maxage=7200
  • public / private: Указывает, можно ли кэшировать ответ в общедоступных (CDN, прокси) или только в приватных (браузер) кэшах.
  • max-age=<seconds>: Максимальное время в секундах, в течение которого ресурс считается свежим.
  • s-maxage=<seconds>: Аналогично max-age, но только для общедоступных кэшей (игнорируется браузером).
  • no-store: Запрещает любое кэширование. Полный запрет.
  • no-cache: Не означает "не кэшировать". Разрешает кэширование, но требует проверки свежести (revalidation) с сервером перед каждым использованием.
  • must-revalidate: Требует от кэша проверять свежесть у истока после истечения max-age. Более строгий, чем no-cache.
  • immutable: Указывает, что ресурс никогда не меняется (например, хэшированные файлы). Браузер не будет отправлять условные запросы.

Директивы для запроса клиента (Request):

Cache-Control: max-age=0
  • max-age=0 / no-cache: Клиент требует проверить свежесть кэшированной копии.
  • only-if-cached: Просить ответ ТОЛЬКО из кэша (полезно для оффлайн-режима).

2. Устаревшие, но важные заголовки

  • Expires: <http-date> (устарел): Указывает абсолютную дату/время истечения срока действия кэша. Менее гибкий, чем max-age. При одновременном использовании Cache-Control имеет приоритет.
  • Pragma: no-cache (устарел для HTTP/1.1): Аналог Cache-Control: no-cache для HTTP/1.0. Почти не используется.

3. Заголовки для валидации кэша (Revalidation)

Используются для условных запросов, чтобы проверить, не изменился ли ресурс.

  • ETag (Entity Tag): Уникальный идентификатор версии ресурса, генерируемый сервером (часто хэш от содержимого).
    ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
    
    Клиент отправляет его в заголовке **`If-None-Match`** для проверки.

  • Last-Modified: Дата последнего изменения ресурса.
    Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
    
    Клиент отправляет ее в заголовке **`If-Modified-Since`**.

Механизм работы: Если у клиента есть кэшированная копия с ETag или Last-Modified, он отправляет условный запрос. Сервер сравнивает значения и отвечает 304 Not Modified (пустое тело — используем кэш) или 200 OK с новыми данными.

4. Специализированные заголовки

  • Vary: Критически важен для корректного кэширования. Указывает серверу/кэшу, какие заголовки запроса должны учитываться при выборе варианта ответа.
    Vary: User-Agent, Accept-Encoding
    
    Это означает, что для разных браузеров (`User-Agent`) или поддержки сжатия (`Accept-Encoding`) должны храниться разные кэшированные версии.

5. Практические стратегии и примеры

Для статичных, версионированных ресурсов (CSS/JS с хэшем в имени):

Cache-Control: public, max-age=31536000, immutable

Год кэширования, так как имя файла (а значит и URL) меняется при обновлении.

Для динамического, но стабильного контента (аватарка пользователя):

Cache-Control: private, max-age=86400
Cache-Control: public, max-age=86400, must-revalidate
ETag: "a3fWa"

Кэширование на день с обязательной валидацией по ETag.

Для персональных или часто меняющихся данных (API, баланс счета):

Cache-Control: no-cache

Или более строго:

Cache-Control: no-store

Ключевые принципы и подводные камни

  1. Приоритетность: Cache-Control (HTTP/1.1) > Expires > Эвристическое кэширование (когда заголовков нет).
  2. no-cache vs no-store: Путаница здесь — самая частая ошибка. no-cache = "кэшируй, но всегда спрашивай", no-store = "не кэшируй вообще".
  3. Проблема Vary: Чрезмерное или неправильное использование (например, Vary: *) может полностью отключить кэширование в некоторых прокси.
  4. Кэширование в браузере vs CDN: Используйте private для личных данных, s-maxage для тонкой настройки CDN.

Итог: Грамотная комбинация Cache-Control, ETag/Last-Modified и Vary позволяет добиться максимальной производительности, минимизируя нагрузку на сервер и передаваемый трафик, при этом гарантируя актуальность контента для пользователя. Настройка кэширования должна быть осознанной частью архитектуры любого современного фронтенд-приложения.

Какие знаешь заголовки для кэширования? | PrepBro