HTTP
Кэширование HTTP-ответов
Поиск…
замечания
Ответы кэшируются отдельно для каждого URL-адреса и каждого метода HTTP.
HTTP-кэширование определено в RFC 7234 .
глоссарий
- fresh - состояние кэшированного ответа, которое еще не истекло. Как правило, свежий ответ может удовлетворять запросы без необходимости контактировать с сервером ответ, исходящий из него.
- stale - состояние кэшированного ответа, которое прошло по истечении срока его действия. Как правило, устаревшие ответы не могут использоваться для удовлетворения запроса без проверки с сервером, сохраняется ли он.
- удовлетворяющий запросу с кешированием, удовлетворяет запросу, когда все условия в запросе соответствуют кешированному ответу, например, они имеют один и тот же HTTP-метод и URL-адрес, ответ свежий или запрос позволяет выполнять устаревшие ответы, заголовки заголовков запросов заголовков, перечисленные в заголовке ответа
Vary
, и т. д. , - revalidation - проверка того, является ли кешированный ответ свежим. Обычно это делается с условным запросом, содержащим статус
If-Modified-Since
илиIf-None-Match
и ответ304
. - частный кеш- кеш для одного пользователя, например, в веб-браузере. Частные кэши могут хранить персонализированные ответы.
- общий кэш - кеш, общий для многих пользователей, например, на прокси-сервере. Такой кеш может отправлять один и тот же ответ нескольким пользователям.
Кэш-ответ для каждого в течение 1 года
Cache-Control: public, max-age=31536000
public
означает, что ответ одинаковый для всех пользователей (он не содержит персонализированной информации). max-age
- через несколько секунд. 31536000 = 60 * 60 * 24 * 365.
Это рекомендуется для статических активов, которые никогда не должны меняться.
Персонализированный ответ кэша в течение 1 минуты
Cache-Control: private, max-age=60
private
указывает, что ответ может быть кэширован только для пользователя, который запросил ресурс, и не может использоваться повторно, когда другие пользователи запрашивают тот же ресурс. Это подходит для ответов, которые зависят от файлов cookie.
Прекратите использование кэшированных ресурсов, не проверив сначала сервер
Cache-Control: no-cache
Клиент будет вести себя так, как будто ответ не был кэширован. Это подходит для ресурсов, которые могут непредсказуемо меняться в любое время и которые пользователи должны всегда видеть в последней версии.
Ответы no-cache
будут медленнее (высокая латентность) из-за необходимости обращаться к серверу каждый раз, когда они используются.
Однако для экономии пропускной способности клиенты могут сохранять такие ответы. Ответы no-cache
не будут использоваться для удовлетворения запросов без обращения к серверу каждый раз, чтобы проверить, можно ли повторно использовать кешированный ответ.
Запросить ответы не на всех
Cache-control: no-store
Предписывает клиентам не кэшировать ответ в любом случае и забыть об этом в самое ближайшее время.
Эта директива была первоначально разработана для чувствительных данных (сегодня вместо этого следует использовать HTTPS), но ее можно использовать, чтобы избежать загрязнения кэшей с ответами, которые нельзя использовать повторно.
Он подходит только в конкретных случаях, когда данные ответа всегда разные, например, конечная точка API, которая возвращает большое случайное число. В противном случае для no-cache
и повторной аттестации можно использовать поведение «неприкасаемого» ответа, сохраняя при этом некоторую пропускную способность.
Устаревшие, избыточные и нестандартные заголовки
Expires
- указывает дату, когда ресурс становится устаревшим. Он полагается на серверы и клиенты, имеющие точные часы и поддерживающие часовые пояса правильно.Cache-control: max-age
имеет преимущество передExpires
и, как правило, более надежным.директивы
post-check
иpre-check
являются нестандартными расширениями Internet Explorer, которые позволяют использовать устаревшие ответы. Стандартная альтернатива являетсяstale-while-revalidate
.Pragma: no-cache
- устарел в 1999 году . Вместо этого следует использоватьCache-control
.
Изменение кэшированных ресурсов
Самый простой способ обхода кеша - изменить URL. Это используется как наилучшая практика, когда URL-адрес содержит версию или контрольную сумму ресурса, например
http://example.com/image.png?version=1
http://example.com/image.png?version=2
Эти два URL-адреса будут кэшироваться отдельно, поэтому даже если …?version=1
было кэшировано навсегда , новая копия может быть немедленно восстановлена как …?version=2
.
Не используйте случайные URL-адреса для обхода кешей. Используйте Cache-control: no-cache
или Cache-control: no-store
вместо этого. Если ответы со случайными URL-адресами отправляются без директивы no-store
, они будут излишне храниться в кэшах и выталкивать из кэша более полезные ответы, снижая производительность всего кеша.