Налаштування HTTP-кешування API: ETag, Last-Modified, Vary

Зауважимо: коли API повертає 200 з повним тілом на кожен запит, це марно витрачає трафік і навантажує сервер. Ми налаштовуємо [HTTP-кешування](https://developer.mozilla.org/ru/docs/Web/HTTP/Caching) так, щоб клієнти та CDN кешували відповіді, а сервер відповідав 304 Not Modified, якщо дані не змінил

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Налаштування HTTP-кешування API: ETag, Last-Modified, Vary
Середній
від 1 дня до 3 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1419
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1244
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    998

Зауважимо: коли API повертає 200 з повним тілом на кожен запит, це марно витрачає трафік і навантажує сервер. Ми налаштовуємо HTTP-кешування так, щоб клієнти та CDN кешували відповіді, а сервер відповідав 304 Not Modified, якщо дані не змінилися. За 7 років ми впровадили цю стратегію в 50+ проектах — знижували трафік до 90% і прискорювали середню відповідь на 50%. Це дозволяє скоротити витрати на інфраструктуру до 70%. Типова економія на інфраструктурі для проектів з 10 000+ запитів на годину становить від 100 000 рублів на місяць.

Проблеми, які ми вирішуємо

Проблема 1: Відсутність ETag — клієнт не може зробити умовний запит. Кожен запит повертає повне тіло, навіть якщо дані не змінювалися. Рішення: обчислюємо хеш за updated_at та id (для одиничних ресурсів) або за максимальним updated_at + кількість записів (для колекцій). ETag точніший за Last-Modified, оскільки реагує на будь-які зміни, а не лише на час.

Проблема 2: Неправильний Vary — CDN кешує відповідь для однієї мови або стиснення і віддає всім. Наприклад, якщо Vary не містить Accept-Language, російський користувач може отримати англійську версію. Рішення: вказуємо всі заголовки, що впливають на представлення.

Проблема 3: «Мертвий» Cache-Control — no-cache без ETag — клієнт не кешує взагалі. Оптимальна комбінація: Cache-Control: public, max-age=60, s-maxage=300 + ETag.

Як ми це робимо: стек та кейс

Використовуємо Laravel 11 на PHP 8.3, PostgreSQL, Redis. Для кожного ендпоінту API визначаємо стратегію кешування:

  • Одиничні ресурси — ETag на основі updated_at + id. Якщо If-None-Match збігається — 304.
  • Колекції — ETag за максимальним updated_at і кількістю записів з урахуванням пагінації.
  • Багатомовні — Vary: Accept-Language, ETag включає код мови.

Приклад з реального проекту: каталог товарів з 50 000 позицій, 10 мов. Після налаштування ETag + Vary трафік на CDN знизився з 200 ГБ/міс до 30 ГБ/міс (на 85%), а середній час відповіді впав з 800 мс до 150 мс для кешованих запитів. Середня економія на CDN-трафіку склала 120 000 рублів на місяць. Якщо хочете отримати аналогічний результат, замовте аудит кешування вашого API.

Чому ETag ефективніший за Last-Modified?

Last-Modified має точність до секунди — якщо оновлення відбуваються частіше, можливі колізії. ETag враховує сам вміст, тому детектує будь-які зміни, включаючи перезапис тих самих даних (якщо хеш рахується за вмістом). Для JSON API ми використовуємо хеш від updated_at та id — він дешевий і достатньо унікальний.

Характеристика ETag Last-Modified
Точність Всі зміни Секундна гранулярність
Обчислення Хеш даних Часова мітка
Колізії Немає при хорошому хеші Можливі при частих оновленнях
Рекомендація JSON API Статичні файли

Налаштування Vary для багатомовного API

Вкажіть у відповіді Vary: Accept-Language, Accept-Encoding. Для CORS з різними origin — Origin. Уникайте Vary: Authorization — кожен токен створює окремий запис у кеші CDN. Якщо потрібна авторизація, використовуйте приватне кешування (private, max-age=0, must-revalidate) та ETag.

Як інвалідувати кеш на CDN?

Використовуйте теги (Cache-Tag) або сурогатні ключі. При оновленні ресурсу надсилаєте запит на purge за тегом. Cloudflare і Fastly підтримують масову інвалідацію одним викликом API. Економія на CDN-трафіку може сягати 90%, що знижує витрати на хостинг.

Директиви Cache-Control

Директива Призначення Приклад
no-cache Вимагати свіжість no-cache
no-store Заборона кешу Конфіденційні дані
public Дозволити CDN Публічний API
private Тільки клієнт Особистий кабінет
max-age Час життя кешу клієнта max-age=60
s-maxage Час життя кешу CDN s-maxage=300
Приклад middleware для Laravel
public function handle($request, Closure $next) { $response = $next($request); if ($response->isSuccessful()) { $etag = md5($response->getContent()); $response->setEtag($etag); $response->setLastModified($response->getDate()); if ($response->isNotModified($request)) { return response()->noContent(304); } } return $response; } 

Процес роботи

  1. Аналітика — аудит поточних заголовків, виявлення вузьких місць.
  2. Проектування — вибір стратегії для кожного ендпоінту (сильне/умовне кешування).
  3. Реалізація — додавання ETag, Last-Modified, Vary в middleware або контролери.
  4. Тестування — перевірка кодів відповіді, заголовків, поведінки CDN.
  5. Деплой — налаштування інвалідації (сурогатні ключі, purge API).

Строки орієнтовно

Етап Строк
Базове кешування (ETag + Last-Modified) 2–4 дні
Повна стратегія (Vary, Cache-Control, інвалідація) 1–2 тижні

Вартість розраховується індивідуально після аналізу вашого API.

Що входить в роботу

  • Реалізація ETag / Last-Modified для всіх ендпоінтів
  • Налаштування Cache-Control та Vary за типами ресурсів
  • Інтеграція з CDN (Cloudflare, Fastly)
  • Система інвалідації кешу (сурогатні ключі або purge API)
  • Документація щодо стратегії кешування
  • Пост-релізна підтримка протягом 2 тижнів

Підсумок

Правильне HTTP-кешування — дешевий спосіб радикально знизити навантаження. Ми гарантуємо, що після налаштування ви побачите падіння трафіку та прискорення відповідей. Отримайте консультацію з налаштування кешування вашого API — ми оцінимо поточну ситуацію та запропонуємо оптимальну стратегію.

RFC 7232