缓存分类:
-
强制缓存:强制缓存若生效,就不需要再和服务器发生交互;
强制缓存
(1)响应头部:Cache-Control/Expires;
(2)优先级递减顺序:
- Cache-Control:
- public:客户端可以缓存;
- private:客户端和代理服务器都可以缓存(默认值);
- max-age=xx;缓存内容在xx秒后失效,失效后进行协商缓存;
- no-cache:需要使用协商缓存验证缓存数据;
- no-store:所有内容都不缓存,强制缓存和协商缓存都不会触发;
- Expires:日期;指定实际的过期日期,绝对过期日期;
-
协商缓存:会与服务器端进行交互;
协商缓存
(1) Etag+If-None-Match规则
-
etag(服务器响应首部字段):服务器资源的唯一标识符,其优先级比last-modified高;
-
if-none-match(请求首部字段):再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识,服务器收到请求后发现有字段if-none-match,则与被请求资源的唯一标识进行对比;
- 若不同,说明资源文件被改动过,则响应新的资源内容,返回状态码200;
- 若相同,说明资源无修改,则响应304的header,告知浏览器继续使用保存的cache;
注:强制缓存的优先级高于协商缓存,即当执行强制缓存的规则时,若缓存生效,直接使用缓存,不再执行对比缓存规则;
(2) Last-Modified+If-Modified-Since规则
- last-modified(响应首部字段):服务器在响应请求时告诉浏览器资源的最后修改时间;
- if-modified-since(请求首部字段):再次请求服务器时,通过此字段将响应中last-modified字段值发送给服务器,服务器收到请求后发现有该字段,则与被请求资源的最后修改时间进行对比;
- 若资源的最后修改大于If-modified-since,说明字段被改动过,则响应整个资源内容,返回状态码200;
- 若资源的最后修改时间小于或等于If-modified-since,说明资源无新修改,则响应304的header,告知浏览器继续使用所保存的cache;
- 各缓存头部优先级情况:
-
强制缓存优先级>对比缓存优先级,即强制缓存在生效期则对比缓存不生效;
- Cache-Control优先级>Expires优先级;
- Etag优先级>Last-Modified优先级;
- 不同刷新的请求执行过程
(1)浏览器地址栏写入URL,回车:web缓存发现有这个文件了,不用继续请求,直接去缓存拿—最快,流量最小;
- 请求的URI在web缓存中未过期:强制缓存;
- 请求的URI在web缓存中已过期,HTTP请求的消息头多了一行if-modified-since/if-none-match,使用对比缓存—问一下服务器,请求的资源有没有被修改过,服务器对比之后,若没有修改则返回304 not modified,浏览器收到后,从缓存里读内容;若有修改则服务器返回200 ok+返回新的内容;
(2) F5/点击刷新按钮:对比缓存—浏览器就发送一个请求带上If-Modified-Since/if-none-match,服务器判断资源是否修改; - 浏览器会自行加上Cache-Control:max-age = 0(会覆盖初始的http响应的该字段,这时浏览器就会认为资源已过期)+If-Modified-Since/if-none-match ,即不管浏览器缓存中的文件过期了没有,都需要将请求发送到服务器进行确认;
(3)Ctrl+F5:浏览器加上Cache-Control:no-cache;删除If-Modified-Since/if-none-match ,即客户端要求所有的中间服务器不返回缓存的资源,直接到服务器上重新下载,于是服务器的响应处理与首次请求这个资源一样,返回200 ok+资源内容; — 最慢,流量最大;
-
浏览器的缓存及清除
浏览器是根据url进行缓存的—页面在不断发http请求,同一个请求url,会被浏览器缓存;
清除缓存:在url中加一个随机数作为请求参数,当页面发起请求时,由于每次的URL地址不同,浏览器会当作不同的请求处理,而不再从缓存中获取; -
总结
- 对于强制缓存:服务器通知浏览器一个缓存时间,在缓存时间内,下次请求直接用缓存,不在时间内,使用协商缓存;
- 对于协商缓存:将缓存信息的Etag和Last-Modified通过请求发送给服务器,头服务器校验,返回状态码304/200;
网友评论