Большинство проблем с кэшированием контента происходит не из-за самой CDN, а из-за неправильных заголовков. Вот что чаще всего идёт не так.
Cache-Control — главный заголовок. Если его нет или он стоит как no-cache, CDN не будет кэшировать вообще. Правильно: public, max-age=3600 (кэш на час) для статики или private, max-age=0 для персональных данных. Без явного max-age CDN угадывает время жизни, и результат непредсказуем.
Vary — коварный заголовок. Если сервер пишет Vary: User-Agent, CDN создаёт отдельную копию контента для каждого браузера. Со временем кэш раздувается, а hit-rate падает. Используй Vary только когда действительно нужно: для сжатия (Vary: Accept-Encoding) или языков (Vary: Accept-Language).
Set-Cookie в ответе — и кэш игнорируется. Если ты устанавливаешь куки на контенте, который должен кэшироваться, переноси их в отдельный эндпоинт или используй Cache-Control: private. Иначе персональные данные одного пользователя просочатся к другому.
ETag и Last-Modified — нужны, но не вместо кэша. Они срабатывают при If-None-Match запросе, возвращая 304 вместо всего контента. Это экономит трафик, но медленнее, чем попадание в кэш. Не забывай: ETag должен быть weak (W/"...") для динамического контента.
Проверь заголовки своего сайта через DevTools → Network → выбери запрос → Response Headers. Если видишь конфликт — кэш вообще не будет работать, и весь трафик пойдёт на origin.
Кустов о CDN и лендах
@kustov_cdn_lendy
Четыре заголовка HTTP, которые ломают кэширование на CDN
Этот пост опубликован в Telegram-канале Кустов о CDN и лендах. Подписаться можно по ссылке: @kustov_cdn_lendy.