Веб-кеширование — это метод, который сохраняет копию веб-ресурса и использует эту копию непосредственно при следующем запросе.
Веб-кэш можно разделить на следующие типы: кеш браузера, кеш CDN, кеш сервера, кеш данных базы данных. Поскольку копия может использоваться напрямую, чтобы избежать повторной отправки запросов или просто для подтверждения того, что ресурс не изменился без повторной передачи объекта ресурса, веб-кеширование может уменьшить задержку и ускорить открытие страницы, повторно использовать ресурсы для снижения потребления пропускной способности сети, уменьшите количество запросов или уменьшите содержимое передачи, чтобы уменьшить нагрузку на сервер.
В этой статье в основном обсуждаются темы, тесно связанные с интерфейсом.浏览器HTTP缓存
механизм.浏览器HTTP缓存
Его можно разделить强缓存
а также协商缓存
.强缓存
а также协商缓存
Самое большое и фундаментальное отличие состоит в том, что при попадании в сильный кеш запрос на сервер не будет отправлен (например, 200 из кеша памяти в chrome), а согласованный кеш обязательно отправит запрос на сервер и проверит, ресурс попадает в согласованный кеш через поле заголовка запроса ресурса. , если согласованный кеш попадает, сервер вернет запрос, но не вернет сущность ресурса, а сообщит клиенту, что ресурс может быть загружен из кеш (304 не изменен). Краткая блок-схема выглядит следующим образом:
HTTP-кеширование браузера определяется полями заголовка HTTP-сообщения.
Поля, управляющие сильным кэшированием, вводятся по приоритету.
-
Pragma
Pragma
Это обычное поле заголовка, оставшееся от версий до HTTP/1.1, и используется только для обратной совместимости с HTTP/1.0. Хотя это обычный заголовок, его поведение в ответных сообщениях не стандартизировано и зависит от реализации браузера. В RFC это поле есть толькоno-cache
Необязательное значение, уведомляющее браузер о том, что кеш напрямую не используется, запрос к серверу, запрашивающий актуальность проверки. Потому что это самый высокий приоритет, когда не будет сильного попадания в кеш. -
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Указывает, что запрос должен сначала подтвердить действительность кеша с сервером, и если он действителен, кеш можно использовать (
协商缓存
), независимо от того, появляется ли это поле в заголовке ответного сообщения или в заголовке сообщения запроса, оно точно не попадет в надежный кэш. Жесткая перезагрузка Chrome (Command+shift+R) добавит в заголовок запросаPragma:no-cache
а такжеCache-Control:no-cache
. - no-storeУказывает, что браузеру и всем промежуточным кешам запрещено хранить любую версию возвращенного ответа, и не должно быть сильного кеша и кеша согласования, который подходит для личных данных о конфиденциальности или экономических данных.
- publicУказывает, что ответ может кэшироваться браузерами, CDN и т. д.
-
privateОтвет используется только как частный кеш и не может быть закэширован CDN и т. д. Если требуется HTTP-аутентификация, автоматически устанавливается ответ
private
.
-
ExpiresExpires — это поле заголовка ответа, в котором указывается дата/время, до которого кэширование HTTP считается действительным. Недопустимая дата, например 0, указывает на то, что срок действия ресурса истек. Если оба установлены
Cache-Control
поле заголовка ответаmax-age
,ноExpires
будет игнорироваться. Это также обычное поле заголовка, оставшееся от версий до HTTP/1.1, и используется только для обратной совместимости с HTTP/1.0.
Поля, управляющие кэшем согласования
-
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
-
ETag/If-None-Match
ETag
Это поле заголовка ответа, представляющее собой хэш-строку, сгенерированную в соответствии с содержимым объекта, которая определяет статус ресурса и генерируется сервером.If-None-Match
является заголовком условного запроса. Если это поле добавляется в заголовок запроса при запросе ресурса, значением является значение ресурса, возвращаемое сервером.ETag
, то тогда и только тогда, когда на сервере нет ресурсовETag
Когда значение атрибута указано в этом заголовке, сервер вернет ответ 200 с запрошенным объектом ресурса, в противном случае сервер вернет ответ 200 без объекта.304
отклик.ETag
соотношение приоритетовLast-Modified
высокий, когда обаETag
преобладать.
If-None-Match:
If-None-Match: , , … Если-нет-совпадения: *
Сравнение атрибутов ETag используетслабый алгоритм сравнения, то есть два файла можно считать одинаковыми, за исключением того, что все биты одинаковы. Например, две страницы можно считать идентичными, если они отличаются только временем создания нижнего колонтитула.
потому чтоETag
характеристики, поэтому по сравнению сLast-Modified
Иметь некоторые преимущества:
1. 某些情况下服务器无法获取资源的最后修改时间
2. 资源的最后修改时间变了但是内容没变,使用ETag可以正确缓存
3. 如果资源修改非常频繁,在秒以下的时间进行修改,Last-Modified只能精确到秒
Общий процесс
Поставьте лайк, добро пожаловать в гости ко мнеблог