Loading...

Примеры использования

Практический пример: настройка заголовков кэша новостного сайта

Высоконагруженный турецкий спортивный новостной сайт управляет кэшированием не через панель, а напрямую со своего origin-сервера. Четыре уровня контента, четыре разных заголовка Cache-Control — и всё это можно проверить со стороны.

Вернуться к справке платформы
О чём эта страница

Реальные заголовки ответа боевого аккаунта и то, почему они выбраны именно такими. Имя клиента не раскрывается; каждый заголовок здесь приведён так, чтобы вы могли проверить его на своём сайте той же командой.

Четыре уровня, четыре разных срока

Один срок кэширования не подходит для новостного сайта: главная страница меняется каждую минуту, логотип не меняется годами. В этом аккаунте контент разделён по скорости изменения.

Контент Заголовок от origin Почему
Главная страница public, max-age=30, s-maxage=30, stale-while-revalidate=60 Срочные новости обновляются каждые 30 секунд; когда срок истекает, посетитель не должен ждать — edge отдаёт старую копию, обновляя её в фоне.
Страницы разделов и списки public, max-age=300, s-maxage=300, stale-while-revalidate=600 Страницы категорий меняются не так часто, как главная. Пять минут — задержка, которую редакция не заметит, а нагрузка на edge заметно падает.
Версионированный статический файл public, max-age=31536000, s-maxage=31536000, immutable Имя файла содержит версию, поэтому его содержимое никогда не меняется. immutable запрещает браузеру повторный запрос даже до истечения max-age.
Оптимизированное изображение max-age=31536000 + public отдельной строкой Эту строку добавляет edge, а не origin — при включённом Image Optimization в правиле заголовок перегенерируется безусловно.

Как настроить то же самое на своём сайте

1

Разделите контент по скорости изменения

Сначала решите, какой путь меняется как часто, а не какие сроки задать — срок это следствие этого решения.

  • Меняется за минуты: главная страница, live-счёт, лента срочных новостей
  • Меняется за часы: страницы категорий, архивные списки
  • Не меняется никогда: CSS, JS, шрифты, логотип — всё, что несёт версию в имени файла
  • Персональное: страницы с авторизацией, корзина, аккаунт — это не кэшируется и не должно кэшироваться
2

Отдавайте заголовки со своего origin

Заголовок отправляет ваше приложение или веб-сервер. Вводить срок в панели не нужно — эти два способа не работают вместе в одном правиле.

  • s-maxage предназначен для общего (shared) кэша, то есть CDN, max-age — для браузера; им можно задать разные значения
  • stale-while-revalidate не заставляет посетителя ждать при истечении срока — отдаётся старая копия, а новая забирается в фоне
  • immutable должен отдаваться только для файлов с версией в имени; на файле без версии он оставит браузер с годовалой копией
3

Оставьте правило зависимым от origin

В Delivery Rules для правила этого пути должен быть включён **Use browser cache time**, а **Cache Expire Time** — оставаться пустым.

  • Если задать срок, заголовки origin в этом правиле игнорируются, а заголовок, уходящий в браузер, тоже переписывается
  • Правила можно разделить по путям: одно правило для статики, другое — для страниц
4

Измерьте, затем расширяйте

Сначала попробуйте на одном пути. Убедившись, что возвращается ожидаемый заголовок и приходит HIT, переходите к остальным уровням.

Как убедиться, что всё работает

Всё видно в заголовках ответа — в панель заглядывать не нужно. Запросите один и тот же URL дважды:

curl -sI https://vash-sayt.ru/stranitsa | grep -iE "cache-control|x-proxy-cache-mt"
  • X-Proxy-Cache-MT: MISS — это нормально для первого запроса: контент как раз кэшируется. Второй запрос должен вернуть HIT.
  • STALE — не ошибка: это значит, что работает stale-while-revalidate — посетитель получает старую копию, пока в фоне забирается новая.
  • Если вы видите BYPASS, вы почти наверняка авторизованы на сайте; сессионная cookie намеренно обходит кэш. Попробуйте снова в приватном окне.
  • Если возвращённый Cache-Control отличается от отправленного вами, значит в этом правиле задан фиксированный срок.
  • Если хотите также увидеть, что отправляет origin, включите в правиле диагностические заголовки origin; X-Upstream-CacheControl показывает то, что сказал origin, Cache-Control — то, что видит посетитель.

Три вещи, которые делают правильный заголовок бесполезным

  • Ответ с Set-Cookie никогда не кэшируется. Неважно, насколько правильный Cache-Control вы отправили. Это самая частая причина, по которой кэш вообще не прогревается: приложение выставляет сессионную cookie на каждый запрос.
  • При включённом Image Optimization в правиле изображения хранятся 365 дней, а заголовок origin игнорируется. Если хотите управлять изображениями сами, выключите эту настройку в правиле.
  • Не отдавайте immutable для файла без версии. Если имя файла не меняется, браузер год держит устаревшую копию, и purge CDN этого не исправит — purge очищает только edge, а не диск посетителя.

Что дальше