Браузерный кэш (Cache-Control)
Когда человек открывает сайт второй раз, заставлять браузер заново качать тот же логотип, те же стили и скрипты — расточительство. Браузерный кэш позволяет сохранить эти файлы на устройстве и при следующем визите взять их с диска, мгновенно. Настраивается это парой заголовков от сервера. Разберём, как и что кэшировать.
Как это работает
При первом заходе браузер скачивает все файлы страницы. Если сервер разрешил их кэшировать, браузер сохраняет копии у себя. На повторном визите (или при переходе на соседнюю страницу того же сайта) он не идёт в сеть за уже знакомыми файлами, а берёт их из локального кэша. Результат — повторные открытия летают, нагрузка на сервер падает, а посетитель видит сайт почти мгновенно. Управляет этим заголовок Cache-Control, который сервер отдаёт вместе с каждым файлом.
Здесь max-age=31536000 — срок хранения в секундах (тут год). То есть «эту картинку можно держать в кэше год, не переспрашивая сервер».
Что кэшировать надолго, а что нет
Логика простая: чем реже файл меняется, тем дольше его можно держать в кэше. Динамический HTML обновляется постоянно — его кэшируют осторожно. Неизменную статику — наоборот, надолго.
А если файл всё-таки изменился?
Тут возникает вопрос: если CSS закэширован на год, как показать посетителю обновлённую версию? Ответ — версионирование имени файла. К адресу добавляют метку версии, например style.css?v=12 или style.a1b2c3.css. Поменяли файл — поменяли метку, и для браузера это уже новый адрес, который он скачает заново. Так вы получаете и долгий кэш, и мгновенное обновление, когда нужно. Этот приём обычно встроен в CMS и сборщики.
Как проверить
Откройте инструменты разработчика (вкладка «Сеть»), обновите страницу и посмотрите заголовки ответа для файлов — там должна быть строка Cache-Control с разумным max-age для статики. Если у картинок и стилей кэш не задан или стоит no-cache — браузер каждый раз качает их заново, и это легко исправить. Наличие кэширования также отмечают PageSpeed и сервисы скорости («задайте эффективный срок жизни кэша»).
Директивы Cache-Control: что значат
У заголовка Cache-Control несколько частей, и полезно понимать основные. max-age задаёт срок хранения в секундах (max-age=31536000 — год). public разрешает кэшировать файл кому угодно, включая промежуточные узлы и CDN; private — только в браузере конкретного пользователя (для персональных страниц). no-cache, вопреки названию, не запрещает кэш, а требует каждый раз переспрашивать сервер, не изменился ли файл, прежде чем взять из кэша. no-store — вот это уже полный запрет, ничего не сохранять (для чувствительных данных). А immutable говорит «этот файл не изменится никогда, даже не переспрашивай» — его ставят версионированной статике для максимальной скорости. Комбинация public, max-age=год, immutable — идеал для неизменных CSS и картинок с версией в имени.
ETag и Last-Modified: умная сверка
Что происходит, когда срок кэша истёк, но файл на самом деле не менялся? Качать заново жалко. Для этого есть условные запросы. Сервер при отдаче файла добавляет «отпечаток» — ETag (хэш содержимого) или Last-Modified (дату изменения). Когда кэш устаревает, браузер не качает файл целиком, а спрашивает: «у меня версия с таким отпечатком, она ещё актуальна?». Если файл не менялся, сервер отвечает коротким «304 Not Modified» без тела — и браузер использует свою копию. Получается, даже при истёкшем кэше повторная загрузка почти ничего не весит. Работает это автоматически, но знать механизм полезно: код 304 в инструментах разработчика — это хорошо, значит сверка работает.
Три уровня кэширования
Кэш на сайте бывает на трёх уровнях, и их легко перепутать. Браузерный кэш — на устройстве посетителя, ускоряет его личные повторные визиты (о нём вся статья). Кэш CDN — на узлах сети по миру, отдаёт статику из ближайшей точки, ускоряя в том числе первый визит. Серверный кэш страниц — сервер хранит уже собранный HTML, чтобы не генерировать его заново при каждом запросе (важно для тяжёлых CMS). Эти уровни не конкурируют, а складываются: CDN снимает нагрузку с сервера, серверный кэш ускоряет генерацию, браузерный — повторные открытия. Настроенные вместе, они дают по-настоящему быстрый сайт.
Частые ошибки
Их несколько, и все типовые. Закэшировать HTML надолго — и посетитель залипает на старой версии страницы, не видя обновлений (HTML кэшируют коротко). Поставить no-cache или вовсе ничего на статику — браузер каждый раз качает картинки и стили заново, теряя весь смысл кэша. Кэшировать надолго без версионирования — обновили CSS, а пользователи со старой закэшированной версией видят сломанную вёрстку, пока кэш не истечёт. И обратное — менять версию там, где файл не поменялся, заставляя зря перекачивать. Правило простое: статика — надолго и с версией в имени, HTML — коротко.
Коротко
Браузерный кэш сохраняет файлы сайта на устройстве посетителя, чтобы при повторных визитах не качать их заново — страницы открываются почти мгновенно, а сервер разгружается. Управляет им заголовок Cache-Control: статику (картинки, шрифты, CSS, JS) кэшируют надолго, а HTML — коротко или без кэша. Чтобы обновлять закэшированные файлы, меняют версию в имени (style.css?v=12). Проверить кэш можно в инструментах разработчика и через PageSpeed.