Как работает HTTP-заголовок «cache-control: s-maxage=31536000, stale-while-revalidate»?

avatar
Dzianis Sudas
9 августа 2021 в 03:58
1334
1
1

Я использую NextJS в своем проекте. Для каждого запроса страницы он добавляет в ответ правила управления кэшем s-maxage=31536000, stale-while-revalidate. Как эти два правила должны работать вместе?

Источник

Ответы (1)

avatar
Sean W
9 августа 2021 в 04:25
2

s-maxage и stale-while-revalidate являются частью cache-control стандарта HTTP-заголовков, которые предписывают кэширование веб-объектов.

Как следует из вашего вопроса, они могут быть разделены запятыми для достижения желаемой стратегии кэширования.

Cache-Control: s-maxage=1, stale-while-revalidate=60

Первое значение (s-maxage) указывает, как долго объект должен кэшироваться в секундах. Он также «переопределяет заголовок max-age или Expires, но только для общих кэшей (например, прокси-серверов) и игнорируется частными кэшами» — см.

Второе значение (stale-while-revalidate), если поддерживается, указывает, как долго после истечения срока действия s-maxage объект может кэшироваться до тех пор, пока его не потребуется снова запросить с вашего сайта.


Пример

  • Первоначальный запрос — содержимое кэшируется с помощью указанных выше директив cache-control
  • Запрос между 1-60 секундами после первоначального запроса — Отображает кэшированное содержимое — Повторная проверка в фоновом режиме
  • Запрос через 60 или более секунд после первоначального запроса — заставляет браузер запрашивать новую версию контента для обслуживания.

Вот как установить заголовки кэширования в Next.js.

Вот связанный пост, который я сделал, который освещает процесс ISR в Next.js.

Joe
9 августа 2021 в 09:36
2

Обратите внимание, что s-maxage означает не то же, что и maxage (см. coderhelper.com/q/39992837/733345); и соответствующая спецификация будет «HTTP», а не «HTML».

Sean W
9 августа 2021 в 16:11
0

Хороший улов Джо! Ночная опечатка. Я не объяснил, как s-maxage переопределяет maxage для общих кешей, потому что в спецификации он находится непосредственно под max-age. Но не помешает добавить его сюда для tl;dr;

Dzianis Sudas
11 августа 2021 в 15:27
1

Заголовок s-maxage=31536000, stale-while-revalidate устанавливается NextJS (SSG) по умолчанию для html-запросов. В своем объяснении вы говорите, что заголовок s-maxage предназначен только для прокси. Зачем нам кешировать html файлы на прокси? Почему stale-while-revalidate не имеет значения?

Sean W
11 августа 2021 в 15:36
0

Я не говорил, что это только для прокси - это объяснение спецификации HTTP (см. спецификацию, которую я связал). Stale-while-revalidate не имеет значения, потому что он не используется. Вы бы кешировали прокси, чтобы вам не приходилось обращаться к вашим веб-серверам при каждом запросе, стандартно кешировать на уровне прокси. imperva.com/learn/performance/cdn-caching

Dzianis Sudas
11 августа 2021 в 15:46
1

Таким образом, для 's-maxage=31536000, stale-while-revalidate' означает ли это, что stale-while-revalidate всегда будет игнорироваться (поскольку у него нет значения), а запрошенный html-файл будет кэшироваться на прокси-сервере (CDN) на 1 год?

Sean W
11 августа 2021 в 18:21
1

Если вы используете сервер, который учитывает заголовок s-maxage, в вашем случае он запросит (не гарантируется) кэширование на 1 год. Прокси-сервер также может устанавливать свои собственные правила вытеснения кеша (распространенный пример аннулирования кеша aws cloudfront). Да, stale-while-revalidate практически отключен.