Cache-Control — HTTP-заголовок, управляющий кэшированием ресурсов в браузере и CDN. Для статики (JS/CSS/изображения с хешем) — public, max-age=31536000, immutable (1 год). Для HTML — public, max-age=60, stale-while-revalidate=86400. Для API — no-store. Правильная настройка ускоряет сайт на 30-80% при повторных визитах.
Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.
Cache-Control: public, max-age=31536000, immutableCache-Control: public, max-age=60, s-maxage=600Cache-Control: no-store (личные данные) или private, max-age=0, must-revalidate| Сценарий | Конфиг / запись |
|---|---|
| nginx: статика с хешем (1 год) | location ~* \.(js|css|png|jpg|woff2)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
} |
| nginx: HTML (короткий кэш) | location / {
add_header Cache-Control "public, max-age=60, s-maxage=600";
} |
| Apache: .htaccess статика | <FilesMatch "\.(js|css|png|jpg|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch> |
| API (no-cache) | Cache-Control: no-store, no-cache, must-revalidate |
| CDN-aware (CDN кэширует, браузер — нет) | Cache-Control: public, max-age=0, s-maxage=86400 |
Cache-Control: no-cache ≠ "не кэшировать". Это "всегда проверяй". Нужно no-store<code>max-age</code> — TTL для private кэшей (браузер). <code>s-maxage</code> — TTL для shared кэшей (CDN, proxy). Если указаны оба — каждый использует свой.
Директива в Cache-Control: "ресурс никогда не изменится". Браузер не отправляет revalidation (If-None-Match) даже при reload. Важно для hash-based assets.
Да. Cache-Control говорит "кэш валиден N секунд". ETag используется при expire для 304 Not Modified (условные запросы). Сочетаются.
<a href="/check">HTTP-чекер Enterno.io</a> → введите URL → раздел Cache покажет Cache-Control, ETag, Age, max-age.