Понимание кэширования браузера и кодов состояния 304

HTTP

В прошлом я не очень много изучал HTTP, но недавно у меня появилось немного свободного времени. В этой статье в основном обсуждаются некоторые сведения о кеше браузера и коде состояния 304. Я поделюсь этим здесь.Вот первая блок-схема HTTP-запроса:

Alt text

1. Подробное обсуждение

1. Отключить ли кеширование

Отключить кэшированиеЭто означает, что в кеше не должно храниться содержимое о клиентских запросах и ответах сервера. Полное содержимое ответа загружается для каждого запроса, инициированного клиентом.

В заголовке запросаCache-Control: no-storeа такжеPragma: no-cacheкеш можно отключить.

Но есть и различия между ними,Pragma: no-cacheСовместимыйhttp 1.0,а такжеCache-Control: no-storeдаhttp 1.1который предоставил. следовательно,Pragma: no-cacheможет применяться кhttp 1.0а такжеhttp 1.1,а такжеCache-Control: no-storeможно применять только кhttp 1.1.

2. Проверять, не просрочена ли локальная копия

Проверять, не устарела ли локальная версияВ основном поCache-Controизno-cacheа такжеmust-revalidateЭти два необязательных значения управляют, где:

  • no-cache: Сообщите браузеру и кэш-серверу, что независимо от того, истек ли срок действия локальной копии, обязательно проверьте действительность копии на исходном сервере перед использованием копии ресурсов.
  • must-revalidate: сообщите браузеру и кэш-серверу, что локальную копию можно использовать до истечения срока действия локальной копии; по истечении срока действия локальной копии она должна быть отправлена ​​на исходный сервер для проверки достоверности.

3. Срок действия локальной копии истек?

Чтобы узнать, устарела ли локальная копия, нам нужно знатьМеханизм истечения кэша:

(1) В механизме выдоха самая важная инструкцияmax-age=<seconds>, который представляет собой максимальное время, на которое ресурс может быть замедлен; обычно он соответствуетmust-revalidateПри совместном использовании это выглядит так:

Cache-Control: max-age=60, must-revalidate

(2), если он не содержитmax-ageатрибут, он проверит, содержит ли онExpiresсвойства, сравниваяExpiresзначение и заголовок внутриDateЗначение свойства, чтобы определить, действителен ли кэш.

Alt text

(3), еслиmax-ageа такжеexpiresАтрибутов нет, ищите в головеLast-ModifiedИнформация. Если есть, то время жизни кеша равно тому, что в шапкеDateзначение минусLast-ModifiedЗначение делится на 10 (Примечание: в соответствии с rfc2626 оно фактически умножается на 10%).

Alt text

4. Если локальная копия не просрочена

Если локальная копия не просрочена, ресурс будет прочитан непосредственно из кеша, и будет возвращен код состояния 200.

Alt text

5, если локальная копия истек

Если локальная копия истечет, она будетПредварительная подготовка к проверке валидности на исходный сервер.

Во-первых, он будет искать в заголовке запросаIf-None-Matchполе, значение которого последним было возвращено серверомETagЗначение заголовка ответа:

Alt text

Alt text

Если заголовок запроса неIf-None-Matchполе, оно будет искаться в заголовке запросаIf-Modified-Sinceполе, значение которого последним было возвращено серверомLast-ModifiedЗначение даты в заголовке ответа:

Alt text

Alt text

еслиIf-None-Matchа такжеIf-Modified-SinceЕсли его нет, данные будут запрашиваться напрямую с сервера.

6. Перейдите на исходный сервер для проверки достоверности.

Если заголовок запроса содержитIf-None-MatchилиIf-Modified-Since, он будет отправлен на исходный сервер для проверки достоверности,Если ресурс исходного сервера не изменился, он вернет 304, если есть изменение, вернет 200;

7. Некоторые из вышеперечисленных процессов также можно представить на следующем рисунке.

Alt text

2. Дополнение

Частный кеш и публичный кеш

существуетCache-ControlТакже есть два значения:privateа такжеpublic,в:

publicДиректива указывает, что ответ может кэшироваться любым посредником (например, промежуточным прокси, CDN и т. д.). Если указаноpublic, некоторые страницы, которые обычно не кэшируются посредником (поскольку по умолчаниюprivate) (например, страницы с информацией об аутентификации HTTP (пароль учетной записи) или некоторые страницы, влияющие на код состояния), будут кэшироваться им.

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

3. Справочные документы

HTTP-протокол MDN Ответ «Юн Чжао» на веб-сайте segmentfault Блог Цзы Юнфэй

исходный адресЛичный сайт Ван Юлюэ