> For the complete documentation index, see [llms.txt](https://docs.tumbler.app/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tumbler.app/ru/uluchsheniya-posle-pervogo-zapuska/caching-and-304.md).

# Кэширование и 304

## Для кого

Команды, настраивающие производительность подписки и желающие снизить нагрузку на origin.

## Что можно сделать

* Включить условные запросы и экономить трафик.
* Настроить правильные заголовки `Cache-Control`, `ETag`, `Last-Modified`.
* Определить политику обновления `version_id`.

## Примеры

* `ETag: "v2025-01-15T12:00:00Z"`
* `Cache-Control: public, max-age=300`
* Ответ `304 Not Modified` при совпадении `If-None-Match`.

## См. также

* [subscription/response-formats.md](/ru/kontrakt-podpiski/response-formats.md)
* [subscription/examples.md](/ru/kontrakt-podpiski/examples.md)
* [operations/reliability-and-timeouts.md](/ru/uluchsheniya-posle-pervogo-zapuska/reliability-and-timeouts.md)

## Рекомендации по заголовкам

* Ставьте `Cache-Control` с публичным max-age, если ответ стабильный.
* Генерируйте сильный `ETag` на основе тела или `version_id`.
* Поддерживайте `If-None-Match` и отдавайте `304` без тела.
* Альтернатива: `Last-Modified` + `If-Modified-Since`, если `ETag` не используется.

## ETag и Last-Modified

* ETag должен быть детерминистичным: вычисляйте его от канонического тела ответа/`version_id` (нормализованный JSON с фиксированным порядком полей и узлов, без случайных пробелов), а не от времени запроса. Один и тот же контент → один и тот же `ETag`.
* Порядок нод важен: клиенты могут выбирать первый пригодный узел или кэшировать их в порядке получения, поэтому перестановка элементов — это новая версия. Меняйте `version_id`/`ETag`, чтобы сбросить кэш с устаревшим порядком, даже при одинаковых значениях полей.
* Для зеркал и CDN выдавайте одинаковый `ETag` на тот же контент, чтобы избежать лишних перекачиваний.
* `Last-Modified` опционален. Ставьте фактическое время изменения данных (не время запроса) и обновляйте вместе с `ETag`.

## Ответ 304

* При наличии `If-None-Match` сравнивайте с текущим `ETag`. Совпало — отвечайте `304 Not Modified` без тела.
* Если используете `Last-Modified`, проверяйте `If-Modified-Since` и также отвечайте `304`, если контент не менялся.
* В ответе `304` повторяйте актуальные `Cache-Control` и `ETag` (если он выставляется), чтобы сохранялась политика кэширования.
* Если в исходном `200` был `Last-Modified`, включайте его и в `304`; если не используете этот заголовок, его можно опустить.

## Политика обновления

* При любом содержательном изменении меняйте `version_id` и `ETag`.
* Не меняйте `ETag` ради декоративных правок — только при изменении полезной нагрузки.
* При добавлении/удалении/перестановке узлов создавайте новую версию: старые клиенты получат 200 с новым телом, а уже закэшировавшие — 304 после обновления `version_id`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tumbler.app/ru/uluchsheniya-posle-pervogo-zapuska/caching-and-304.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
