浏览器缓存笔记

发布时间:2023年12月19日

一、浏览器缓存中常见HTTP头部简介

1、Cache-Control响应头

public:表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,即使是通常不可缓存的内容。(例如:1.该响应没有max-age指令或Expires消息头;2. 该响应对应的请求方法是 POST 。)

private:表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:对应用户的本地浏览器。

no-cache:协商缓存,在发布缓存副本之前,强制要求缓存把请求提交给原始服务器进行验证。

no-store:不使用任何缓存,缓存不应存储有关客户端请求或服务器响应的任何内容。

max-age=<seconds>:强制缓存,设置缓存存储的最大周期,超过这个时间缓存被认为过期 (单位秒)。与Expires相反,时间是相对于请求的时间。

s-maxage=<seconds>:强制缓存,覆盖max-age或者Expires头,但是仅适用于共享缓存 (比如各个代理),私有缓存会忽略它。

2、Expect响应头

Expires: <http-date>:响应头包含日期/时间,即在此时候之后,响应过期。如果在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。

3、ETag响应头

HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞”)。

4、Last-Modified响应头

是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 ETag 要低,所以这是一个备用机制。包含有 If-Modified-Since 或 If-Unmodified-Since 首部的条件请求会使用这个字段。

5、If-Modified-Since 请求头

If-Modified-Since 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。不同于 If-Unmodified-Since, If-Modified-Since 只可以用在 GET 或 HEAD 请求中。

6、If-Unmodified-Since请求头

If-Unmodified-Since 是一个条件式请求首部,只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 POST 或其他 non-safe 方法的请求。如果所请求的资源在指定的时间之后发生了修改,那么会返回 412 (Precondition Failed) 错误。

7、If-None-Match请求头

If-None-Match 是一个条件式请求首部。对于 GET 和 HEAD 请求方法来说,当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端才会返回所请求的资源,响应码为 200 。如存在服务器端返回响应码 304(Not Modified,未改变)。

二、常见的缓存方式

1、强缓存

????????根据 Cache-Control:max-age=<seconds>或 Expires: <http-date>判断为强制缓存。
? ? ? ? 例如:Cache-Control 为 max-age = 3000,意思是说在 3000 秒后该资源过期。

2、协商缓存

????????根据Cache-Control 值: no-cache 或 max-age=0 判断为协商缓存。

????????浏览器会携带缓存标识 If-None-Match、if-modified-since 向服务器发送请求,服务器根据缓存标识来决定该资源是否过期。先判断Etag(如有) = If-None-Match 继续判断 Last-Modified(如有) = if-modified-since 如果都相等304,否则返回服务器资源和200。?
? ? ? ? 例如:Cache-Control : no-cache ?意思是使用的协商混存。

3、启发式缓存

????????当不设置Cache-Control或 Expires时,触发启发式缓存。如Date创建时间大于Last-Modified一年,那么浏览器会默认进行读取本地缓存时间为1year * 0.1约为36.5天,即在接下来的36.5天里,不会发送HTTP请求,直接拉取本地缓存,表现为disk cache或者memory cach。

三、缓存完整流程

1、用户通过浏览器发起请求 。

2、根据 Cache-Control或 Expires字段判断内存中是否存在有效期的强缓存或者启发式缓存,如存在内存中返回资源,不存在继续判断。

3、根据 Cache-Control或 Expires字段判断磁盘中是否存在有效期的强缓存或者启发式缓存,如存在磁盘中返回资源,不存在继续判断。

4、根据 Cache-Control或 Expires字段判断是都是协商缓存,如是按照协商缓存处理。

5、如Cache-Control: no-store ,则不进行缓存,直接从服务器拉取资源。


四、其他

浏览器和CDN缓存相互独立,CND节点收到协商缓存验证时,直接通过cnd节点中的资源进行验证。(未证实)

Cache-Control等字段经过多个nginx时,如都设置了Cache-Control值将全部体现在返回包中,不会替换。
?

文章来源:https://blog.csdn.net/weixin_42451330/article/details/135087620
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。