Примеры использования
Практический пример: настройка заголовков кэша новостного сайта
Высоконагруженный турецкий спортивный новостной сайт управляет кэшированием не через панель, а напрямую со своего 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 в правиле заголовок перегенерируется безусловно. |
Как настроить то же самое на своём сайте
Разделите контент по скорости изменения
Сначала решите, какой путь меняется как часто, а не какие сроки задать — срок это следствие этого решения.
- Меняется за минуты: главная страница, live-счёт, лента срочных новостей
- Меняется за часы: страницы категорий, архивные списки
- Не меняется никогда: CSS, JS, шрифты, логотип — всё, что несёт версию в имени файла
- Персональное: страницы с авторизацией, корзина, аккаунт — это не кэшируется и не должно кэшироваться
Отдавайте заголовки со своего origin
Заголовок отправляет ваше приложение или веб-сервер. Вводить срок в панели не нужно — эти два способа не работают вместе в одном правиле.
- s-maxage предназначен для общего (shared) кэша, то есть CDN, max-age — для браузера; им можно задать разные значения
- stale-while-revalidate не заставляет посетителя ждать при истечении срока — отдаётся старая копия, а новая забирается в фоне
- immutable должен отдаваться только для файлов с версией в имени; на файле без версии он оставит браузер с годовалой копией
Оставьте правило зависимым от origin
В Delivery Rules для правила этого пути должен быть включён **Use browser cache time**, а **Cache Expire Time** — оставаться пустым.
- Если задать срок, заголовки origin в этом правиле игнорируются, а заголовок, уходящий в браузер, тоже переписывается
- Правила можно разделить по путям: одно правило для статики, другое — для страниц
Измерьте, затем расширяйте
Сначала попробуйте на одном пути. Убедившись, что возвращается ожидаемый заголовок и приходит 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, а не диск посетителя.
Что дальше
- Руководство по Cache-Control и max-age — что делает каждая директива
- Генератор заголовков Cache-Control — выберите директивы и получите заголовок
- Как очистить кэш CDN — когда purge нужен, а когда нет