Механизм HTTP-кеширования браузера

внешний интерфейс сервер HTTP браузер

Веб-кеширование — это метод, который сохраняет копию веб-ресурса и использует эту копию непосредственно при следующем запросе.

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

В этой статье в основном обсуждаются темы, тесно связанные с интерфейсом.浏览器HTTP缓存механизм.浏览器HTTP缓存Его можно разделить强缓存а также协商缓存.强缓存а также协商缓存Самое большое и фундаментальное отличие состоит в том, что при попадании в сильный кеш запрос на сервер не будет отправлен (например, 200 из кеша памяти в chrome), а согласованный кеш обязательно отправит запрос на сервер и проверит, ресурс попадает в согласованный кеш через поле заголовка запроса ресурса. , если согласованный кеш попадает, сервер вернет запрос, но не вернет сущность ресурса, а сообщит клиенту, что ресурс может быть загружен из кеш (304 не изменен). Краткая блок-схема выглядит следующим образом:

强缓存与协商缓存

HTTP-кеширование браузера определяется полями заголовка HTTP-сообщения.

报文结构

Поля, управляющие сильным кэшированием, вводятся по приоритету.

  1. Pragma        PragmaЭто обычное поле заголовка, оставшееся от версий до HTTP/1.1, и используется только для обратной совместимости с HTTP/1.0. Хотя это обычный заголовок, его поведение в ответных сообщениях не стандартизировано и зависит от реализации браузера. В RFC это поле есть толькоno-cacheНеобязательное значение, уведомляющее браузер о том, что кеш напрямую не используется, запрос к серверу, запрашивающий актуальность проверки. Потому что это самый высокий приоритет, когда не будет сильного попадания в кеш.

  2. Cache-Control        Cache-ControlЯвляется универсальным заголовком, который также является основным полем кэша браузера управления HTTP/1.1. А кэш браузера связан со следующими ответными инструкциями:

инструкция параметр иллюстрировать
private без Указывает, что ответ может кэшироваться только одним пользователем, а не как общий кеш (т. е. прокси-сервер не может его кэшировать).
public можно опустить Указывает, что ответ может кэшироваться любым объектом (в том числе: клиентами, прокси-серверами и т. д.) для отправки запросов.
no-cache можно опустить Должен подтвердить свою действительность перед кэшированием
no-store без Не кэширует содержимое запроса или ответа
max-age=[s] требуется максимальное значение ответа
  • max-age(единица измерения – с) Установите время существования кеша относительно времени отправки запроса. Устанавливается только заголовок ответного сообщенияCache-Controlотличен от нуляmax-ageИли установите значение больше запрашиваемой датыExpires(Я расскажу об этом позже) Можно попасть в сильный кеш. При выполнении этого условия заголовок ответного сообщенияCache-Controlне существуетno-cache,no-storeИ заголовок сообщения запроса не существуетPragmaполе, действительно ударит по сильному кешу. Все изображения ниже являются скриншотами обновления (command+R).

响应报文首部no-cache和max-age同时存在
响应报文首部no-store和max-age同时存在
请求报文首部Pragma,响应报文首部max-age

  • no-cacheУказывает, что запрос должен сначала подтвердить действительность кеша с сервером, и если он действителен, кеш можно использовать (协商缓存), независимо от того, появляется ли это поле в заголовке ответного сообщения или в заголовке сообщения запроса, оно точно не попадет в надежный кэш. Жесткая перезагрузка Chrome (Command+shift+R) добавит в заголовок запросаPragma:no-cacheа такжеCache-Control:no-cache.
  • no-storeУказывает, что браузеру и всем промежуточным кешам запрещено хранить любую версию возвращенного ответа, и не должно быть сильного кеша и кеша согласования, который подходит для личных данных о конфиденциальности или экономических данных.
  • publicУказывает, что ответ может кэшироваться браузерами, CDN и т. д.
  • privateОтвет используется только как частный кеш и не может быть закэширован CDN и т. д. Если требуется HTTP-аутентификация, автоматически устанавливается ответprivate.
  1. ExpiresExpires — это поле заголовка ответа, в котором указывается дата/время, до которого кэширование HTTP считается действительным. Недопустимая дата, например 0, указывает на то, что срок действия ресурса истек. Если оба установленыCache-Controlполе заголовка ответаmax-age,ноExpiresбудет игнорироваться. Это также обычное поле заголовка, оставшееся от версий до HTTP/1.1, и используется только для обратной совместимости с HTTP/1.0.

Поля, управляющие кэшем согласования

  1. Last-Modified/If-Modified-SinceIf-Modified-Since является полем заголовка запроса и может использоваться только вGETилиHEADзапрос.Last-Modifiedполе заголовка ответа, содержащее дату и время изменения ресурса, идентифицированного сервером. при переноскеIf-Modified-SinceПри обращении к серверу для запроса ресурса сервер проверяетLast-Modified,еслиLast-Modifiedвремя раньше или равноIf-Modified-Sinceвернет тело без304Ответ, иначе ресурс будет возвращен.

If-Modified-Since: , :: GMT Last-Modified: , :: GMT

  1. ETag/If-None-Match        ETagЭто поле заголовка ответа, представляющее собой хэш-строку, сгенерированную в соответствии с содержимым объекта, которая определяет статус ресурса и генерируется сервером.If-None-Matchявляется заголовком условного запроса. Если это поле добавляется в заголовок запроса при запросе ресурса, значением является значение ресурса, возвращаемое сервером.ETag, то тогда и только тогда, когда на сервере нет ресурсовETagКогда значение атрибута указано в этом заголовке, сервер вернет ответ 200 с запрошенным объектом ресурса, в противном случае сервер вернет ответ 200 без объекта.304отклик.ETagсоотношение приоритетовLast-Modifiedвысокий, когда обаETagпреобладать.

If-None-Match: If-None-Match: , , … Если-нет-совпадения: *

ETag与If-None-Match

Сравнение атрибутов ETag используетслабый алгоритм сравнения, то есть два файла можно считать одинаковыми, за исключением того, что все биты одинаковы. Например, две страницы можно считать идентичными, если они отличаются только временем создания нижнего колонтитула.

потому чтоETagхарактеристики, поэтому по сравнению сLast-ModifiedИметь некоторые преимущества:

    1.  某些情况下服务器无法获取资源的最后修改时间
    2.  资源的最后修改时间变了但是内容没变,使用ETag可以正确缓存
    3.  如果资源修改非常频繁,在秒以下的时间进行修改,Last-Modified只能精确到秒

Общий процесс

整体流程

Поставьте лайк, добро пожаловать в гости ко мнеблог