[Документация Yandex Cloud](../../index.md) > [Yandex Cloud CDN](../index.md) > [Концепции](index.md) > Кеширование контента

# Кеширование контента

В настройках CDN-ресурса можно включить _кеширование контента_ — временное хранение копий файлов из источников. Кеширование бывает двух типов:
* на CDN-серверах, расположенных в [точках присутствия](points-of-presence.md).
* в браузерах-клиентах.

## Кеширование на CDN-серверах {#server-side}

Если для ресурса включено кеширование на CDN-серверах, файлы копируются из [источников](origins.md) в кеш серверов при следующих событиях:

* Пользователь запросил у [CDN-ресурса](resource.md) файл, который в текущий момент не закеширован отвечающим сервером.
* [Время жизни](caching.md#server-side-cache-age) кеш-копии файла на CDN-сервере истекло, а файл в источнике за это время изменился (иначе время жизни продлевается на тот же период).
* Вы [принудительно загрузили](caching.md#prefetch) файлы из источников в кеш CDN-серверов в настройках CDN-ресурса.

### Время жизни кеша {#server-side-cache-age}

Пока время жизни кеша не истекло, CDN-сервер возвращает клиентам кешированную копию файла и не обращается за ним к источникам.

{% note info %}

Если контент не запрашивался конечными пользователями в течение 36 часов, он удаляется из кеша CDN-серверов независимо от настроек опции.

{% endnote %}

Для определения времени жизни кеша можно выбрать один из двух режимов:

| Режим | Описание |
| ----- | ----- |
| Как у источника | Файл кешируется на время, указанное в ответе источника на запрос. Источник должен добавлять к ответу HTTP-заголовок `Cache-Control` с директивами `max-age` (указывает на время жизни кеша в секундах) и `public` (разрешает кеширование файла на любом уровне).<br/>Если источник ответил HTTP-кодом состояния `200`, `201`, `204`, `206`, `301`, `302`, `303`, `304`, `307` или `308`, но в ответе нет заголовка, удовлетворяющего условиям выше, файл кешируется на время, указанное в настройках ресурса. Файлы из ответов с другими кодами состояния при отсутствии заголовка не кешируются. |
| Свои настройки | В настройках ресурса указывается время жизни кеша по умолчанию. Оно действует для всех ответов источников с HTTP-кодами состояния `200`, `206`, `301` и `302`. Также для любого кода состояния (вне зависимости от того, входит ли он в список выше) можно указать отдельное время жизни кеша, которое имеет приоритет над временем по умолчанию.<br/>Если код состояния не входит в список и для него не указано отдельное время жизни кеша, файл из ответа с таким кодом не кешируется. |

## Кеширование в браузерах {#client-side}

Если для ресурса включено кеширование в браузерах, CDN-серверы будут добавлять в ответы с HTTP-кодами состояния `200`, `201`, `204`, `206`, `301`, `302`, `303`, `304`, `307` и `308` заголовок `Cache-Control` с директивами `max-age` (указывает на время жизни кеша в секундах) и `public` (разрешает кеширование файла на любом уровне). Время жизни кеша указывается в настройках ресурса.

Файлы из ответов с другими кодами состояния не кешируются.

## Файлы cookie и query-параметры {#cookie-and-query}

Запросы к CDN-серверу могут содержать один и тот же путь в URI, но разные файлы cookie (HTTP-заголовок `Cookie`) и/или разные query-параметры.

В настройках ресурса можно указать, как кешировать файлы, соответствующие таким запросам:

#|
|| Параметр | Опция **Игнорировать** выключена | Опция **Игнорировать** включена ||
|| Query‑параметры | Строка запроса используется как часть ключа объекта в кеше. Каждый уникальный набор параметров — отдельная копия файла. | Строка запроса игнорируется. Для всех вариантов сохраняется одна копия файла. ||
|| Cookie | Ответы на запросы с заголовком `Cookie` не кешируются. При получении запроса файл запрашивается из источника заново. | Ответы на запросы с заголовком `Cookie` кешируются. При получении запроса используется файл из кеша. ||
|#

## Принудительное кеширование контента {#prefetch}

Отдельные файлы можно принудительно (вручную) [загрузить](../operations/resources/prefetch-files.md) из источников в кеш CDN-серверов, не дожидаясь запросов от клиентов. Вручную в кеш рекомендуется загружать большие файлы размером от 200 МБ.

Принудительно загрузить в кеш можно только контент, которого еще нет на CDN-серверах. Чтобы обновить в кеше уже имеющиеся там файлы, необходимо предварительно [очистить кеш](caching.md#purge).

Для принудительного кеширования существуют технические ограничения — [лимиты](limits.md).

## Очистка кеша {#purge}

Копии файлов, сделанные CDN-серверами, можно удалить — _очистить кеш_. Это позволяет быстро обновить в CDN контент, который изменился в источниках.

{% note warning %}

Количество путей к файлам в одном запросе на очистку кеша [ограничено](limits.md#cdn-limits).

{% endnote %}

Кеш можно [очистить](../operations/resources/purge-cache.md) полностью или частично. Рекомендуется частичная очистка: если удалить из кеша копии всех файлов, CDN-серверы сильно увеличат нагрузку на источники, обращаясь к ним за каждым запрошенным файлом.

Для частичной очистки кеша можно указывать пути к конкретным файлам и каталогам. Каждый путь должен начинаться с символа `/`.

{% note info %}

* Символ подстановки `*` может быть указан только в конце пути. Если указать `*` в начале или середине пути, кеш для соответствующих этому пути файлов не будет очищен.
* Если для ресурса включена [сегментация файлов](../operations/resources/enable-segmentation.md), при выборочной очистке кеша конкретного файла нужно учитывать, что файл хранится на CDN-серверах по частям. Используйте один из вариантов:

    * добавьте символ подстановки `*` в конец пути к файлу — например, `/image/foobar.png*`;
    * укажите в пути конкретный диапазон байт сегмента с помощью суффикса `@bytes=<начало>-<конец>` — например, `/image/foobar.png@bytes=0-10485759` для очистки первого сегмента размером 10 МБ.

    Если указать только путь к файлу без `*` или суффикса `@bytes`, кеш сегментированного файла очищен не будет.

{% endnote %}

Примеры путей:

{% list tabs group=cdn_provider %}

- Yandex Cloud CDN {#yc}

  * `/image/foobar.png` — отдельный файл;
  * `/image/foo*` — все файлы в каталоге `/image/`, имена которых начинаются с `foo`;
  * `/static/*` — все файлы в каталоге `/static/`.

{% endlist %}

Если файл закеширован с учетом [query-параметров](#cookie-and-query) (то есть для каждого запроса с новыми параметрами сохранилась отдельная копия), по умолчанию удаляются все его копии. Чтобы удалить только конкретные копии, нужно явно указать их query-параметры: например, `/image/foo.png?id=12345`.

{% note warning %}

Если в CDN-ресурсе используются заголовки `Vary` (например, `Vary: Accept-Encoding`), то при очистке кеша в конец пути необходимо добавлять символ подстановки `*`, чтобы удалять все возможные закешированные версии файлов. Например: `/image/foobar.png*`.

{% endnote %}

## Примеры использования {#examples}

* [Организация сине-зеленого и канареечного развертывания версий веб-сервиса](../tutorials/blue-green-canary-deployment.md)
* [Публикация обновлений для игр с помощью Yandex Cloud CDN](../tutorials/prefetch.md)


#### Полезные ссылки {#see-also}

* [Инструкция по настройке кеширования](../operations/resources/configure-caching.md)
* [Инструкция по принудительному кешированию контента](../operations/resources/prefetch-files.md)
* [Инструкция по очистке кеша](../operations/resources/purge-cache.md)