SEO html5css.dev
html5css.dev

SEO продвижение сайтов

Полный цикл: от проектирования и семантики до ссылочного, перелинковки и текстов.

0. Старт С чего начинается работа: цели, инструменты, сервисы 2 1. Проектирование сайта Структура, семантика, title и description 11 2. Прототипирование Карточка товара и страница категории на примере магазина 3 3. Контент и ключевые слова Ключи в тексте, заголовки, объём, читаемость, изображения, внутренние ссылки 20 3.1. Сайт целиком и коммерция Структура, sitemap, крошки, домен, контакты, ассортимент, доставка, поддержка 22 3.2. Поведенческие факторы Домен и бренд, релевантность title, вложенность, удовлетворённость пользователя 11 4. Техническая оптимизация Скорость, дубли, robots.txt, sitemap.xml, битые страницы 9 5. Внешние факторы Ссылочное, доноры, анкоры, линкбилдинг 13 6. Продвижение бренда Брендовый трафик и его оценка 3 7. Нестандартные методы Актуализация контента, нулевая позиция, SILO, обрезка контента 17 8. Крауд-маркетинг Форумы, отзовики, Q&A, соцсети, поиск площадок и сервисы 16 8.1. Стратегии крауда Стратегии размещения, выживаемость постов, объёмы, делегирование 11 9. Юзабилити сайта Макет, навигация, формы, корзина, контрастность 10 10. Внутренняя перелинковка Вес страниц, анкоры, схемы связывания 10 11. Работа с текстами LSI, структура текста, применение ключей 8

С чего начать

Последовательный курс: проектирование → внутренняя оптимизация → техничка → ссылочное → тексты.

15глав
166уроков

Мобильная выдача

Отдельный курс про мобильный индекс: скорость, интерфейс, голосовой поиск и регионы.

6глав
44урока

Новый курс

Поиск всё чаще отвечает текстом. Курс о том, как попадать в источники этих ответов и не потерять доверие.

5глав
15уроков
  1. html5css.dev
  2. SEO
  3. Мобильное SEO
  4. Скорость сайта
  5. Настройка многоуровневого кеширования
Глава 4 · Скорость сайта Урок 6 из 7 Обновлено 26.08.2026

Настройка многоуровневого кеширования

Кеш — самый дешёвый способ ускорения: лучший запрос тот, которого не было. Разбираем четыре уровня, правильные заголовки для каждого типа ресурса и главную сложность — инвалидацию.

Что изменилось с прошлой версии урока Раньше урок ограничивался заголовком Expires и советом «поставить месяц на картинки». Ниже — актуальная схема с версионированием файлов, immutable и тегированной инвалидацией.

Четыре уровня

УровеньЧто хранитВыигрышЧем управляется
1. БраузерСтатику и ответыНоль запросов при повторном визитеCache-Control, ETag
2. CDNСтатику и HTMLОтвет из ближайшей точкиЗаголовки + настройки CDN
3. СерверГотовые страницыПриложение не запускаетсяКеш nginx, кеш CMS
4. ПриложениеРезультаты запросов к базеБаза не нагружаетсяRedis, Memcached, OPcache

Правило: чем ближе к пользователю сработал кеш, тем дешевле ответ. Поэтому настраивают сверху вниз.

Заголовки по типам ресурсов

РесурсCache-ControlПочему
CSS, JS с версией в имениpublic, max-age=31536000, immutableМеняется имя — меняется URL
Изображения с версиейpublic, max-age=31536000, immutableТо же
Шрифтыpublic, max-age=31536000, immutableПрактически не меняются
HTML контентных страницpublic, max-age=300, s-maxage=3600Свежесть важнее экономии
HTML персонализированныхprivate, no-storeНельзя отдавать чужие данные
API-ответыprivate, max-age=0, must-revalidateВалидация по ETag
sitemap.xml, robots.txtpublic, max-age=3600Меняются редко, но должны обновляться
# nginx: долгий кеш для версионированной статики
location ~* \.(css|js|woff2|avif|webp|jpg|png|svg)$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
    access_log off;
}

# HTML: короткий кеш у браузера, длиннее у CDN
location / {
    add_header Cache-Control "public, max-age=300, s-maxage=3600";
}

Версионирование вместо сброса

Главный приём, делающий годовой кеш безопасным: имя файла содержит хеш содержимого. Изменили файл — изменился URL — браузер загрузит новый, а старый просто перестанет использоваться.

/css/main.a3f9c21b.css
/js/app.7d20e14c.js
/img/hero.5b81ff09.avif

Альтернатива попроще — метка времени изменения файла в параметре. Именно так устроены ассеты этого раздела: в inc/ctx.php есть функция seo_asset(), добавляющая ?v= по filemtime. Кеш сбрасывается сам при любой правке CSS или JS.

Инвалидация: самое сложное место

Проблема не в том, чтобы закешировать, а в том, чтобы вовремя сбросить. Изменили цену товара — устарели карточка, страница категории, результаты фильтра, блок «похожие» на десятке других страниц и главная.

  • Тегирование кеша. Каждой закешированной странице сопоставляются теги сущностей на ней: product:1024, category:15. При изменении товара сбрасываются все страницы с его тегом.
  • Короткий TTL для изменчивого. Там, где тегирование не окупается, проще поставить пять минут.
  • Сброс по событию. Публикация или изменение цены дёргает очистку конкретных ключей.
  • Прогрев после сброса. Массовая инвалидация без прогрева даёт всплеск нагрузки.
  • Никогда не кешировать надолго HTML без версии — иначе правка «не выезжает» неделями.
Кеш и персонализация Самая опасная ошибка — отдать закешированную страницу с чужими данными: именем в шапке, содержимым корзины, ценой для конкретного клиента. Персонализированные фрагменты подгружайте отдельным запросом или помечайте страницу как private, no-store.

Проверка

# заголовки кеширования конкретного ресурса
curl -sI https://site.ru/css/main.a3f9c21b.css | grep -iE 'cache-control|etag|age'

# сработал ли кеш на повторном запросе
curl -sI -H 'If-None-Match: "abc123"' https://site.ru/page/ | head -1

В DevTools → Network колонка Size показывает «disk cache» или «memory cache» для ресурсов, взятых из кеша браузера. Если при повторной загрузке всё качается заново — заголовки настроены неверно.

Итог

Настраивайте сверху вниз: годовой кеш для версионированной статики, короткий для HTML, полностраничный кеш на сервере для контентных страниц, кеш запросов в приложении. Основная работа приходится не на включение кеша, а на аккуратную инвалидацию. Дальше — использование CDN.

Частые вопросы

Какие заголовки ставить для статики?

Для файлов с версией в имени — Cache-Control: public, max-age=31536000, immutable. Год кеша безопасен, потому что при изменении файла меняется его имя, а значит и URL.

Как кешировать HTML?

Коротко или через валидацию. Для страниц, которые редко меняются, подходит max-age=0, must-revalidate с ETag: браузер спрашивает сервер, изменилось ли что-то, и обычно получает 304.

Что такое инвалидация кеша и почему это сложно?

Сброс устаревших данных. Сложность в том, что одна правка может затрагивать десятки закешированных страниц: изменили цену товара — устарели карточка, категория, поиск и главная. Решается тегированием кеша.

Нужен ли полностраничный кеш?

Для контентных страниц — да, это самый большой выигрыш: приложение не запускается вовсе. Для персонализированных страниц (корзина, личный кабинет) он не подходит.

Вся глава «Скорость сайта» — 7 уроков
  1. Производительность сайта и способы её измерения
  2. Минификация контента
  3. Сжатие: Brotli и GZIP
  4. Оптимизация изображений
  5. Протоколы HTTP/2 и HTTP/3
  6. Настройка многоуровневого кеширования
  7. Использование CDN