В прошлом я не очень много изучал HTTP, но недавно у меня появилось немного свободного времени. В этой статье в основном обсуждаются некоторые сведения о кеше браузера и коде состояния 304. Я поделюсь этим здесь.Вот первая блок-схема HTTP-запроса:
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Значение свойства, чтобы определить, действителен ли кэш.
(3), еслиmax-age
а такжеexpires
Атрибутов нет, ищите в головеLast-ModifiedИнформация. Если есть, то время жизни кеша равно тому, что в шапкеDate
значение минусLast-Modified
Значение делится на 10 (Примечание: в соответствии с rfc2626 оно фактически умножается на 10%).
4. Если локальная копия не просрочена
Если локальная копия не просрочена, ресурс будет прочитан непосредственно из кеша, и будет возвращен код состояния 200.
5, если локальная копия истек
Если локальная копия истечет, она будетПредварительная подготовка к проверке валидности на исходный сервер.
Во-первых, он будет искать в заголовке запросаIf-None-Matchполе, значение которого последним было возвращено серверомETagЗначение заголовка ответа:
Если заголовок запроса неIf-None-Matchполе, оно будет искаться в заголовке запросаIf-Modified-Sinceполе, значение которого последним было возвращено серверомLast-ModifiedЗначение даты в заголовке ответа:
еслиIf-None-Match
а такжеIf-Modified-Since
Если его нет, данные будут запрашиваться напрямую с сервера.
6. Перейдите на исходный сервер для проверки достоверности.
Если заголовок запроса содержитIf-None-Match
илиIf-Modified-Since
, он будет отправлен на исходный сервер для проверки достоверности,Если ресурс исходного сервера не изменился, он вернет 304, если есть изменение, вернет 200;
7. Некоторые из вышеперечисленных процессов также можно представить на следующем рисунке.
2. Дополнение
Частный кеш и публичный кеш
существуетCache-Control
Также есть два значения:private
а такжеpublic
,в:
public
Директива указывает, что ответ может кэшироваться любым посредником (например, промежуточным прокси, CDN и т. д.). Если указаноpublic
, некоторые страницы, которые обычно не кэшируются посредником (поскольку по умолчаниюprivate
) (например, страницы с информацией об аутентификации HTTP (пароль учетной записи) или некоторые страницы, влияющие на код состояния), будут кэшироваться им.
а такжеprivate
Это означает, что ответ предназначен для одного пользователя, посредник не может кэшировать ответ, и ответ может использоваться только в частном кеше браузера.
3. Справочные документы
HTTP-протокол MDN Ответ «Юн Чжао» на веб-сайте segmentfault Блог Цзы Юнфэй
исходный адресЛичный сайт Ван Юлюэ