Web 缓存大体能够分为:数据库缓存、服务器端缓存(代理服务器缓存、CDN 缓存)、浏览器缓存。数据库
浏览器缓存也包含不少内容: HTTP 缓存、indexDB、cookie、localstorage 等等。这里咱们只讨论 HTTP 缓存相关内容。浏览器
浏览器缓存主要是 HTTP 协议定义的缓存机制。缓存
2.缓存过时机制
强缓存能够认为没有过时的缓存,协调缓存指已过时但未被服务器修改的内容。服务器
3.强缓存 命中强缓存时,浏览器并不会将请求发送给服务器。在Chrome的开发者工具中看到http的返回码是200,可是在Size列会显示为(from cache)。cookie
强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。 ide
缓存过时时间,用来指定资源到期的时间,是服务器端的具体的时间点。工具
Expires是Web服务器响应消息头字段,表明资源的失效时间,是绝对是时间。.net
因为失效时间是一个绝对时间,因此当客户端本地时间被修改之后,服务器与客户端时间误差变大之后,就会致使缓存混乱。因此出现了3.2 Cache-Control3d
https://blog.csdn.net/u012375924/article/details/82806617,讲的不错。localstorage
请求中Cache-Control可选项:
在响应中使用Cache-Control 时,它可选的值有:
Cache-Control是一个相对时间,例如Cache-Control:3600,表明着资源的有效期是3600秒。
Cache-Control比Expires优先级高。
若未命中强缓存,则浏览器会将请求发送至服务器。服务器根据http头信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match来判断是否命中协商缓存。若是命中,则http返回码为304,浏览器从缓存中加载资源。
浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间:
当浏览器再次请求该资源时,发送的请求头中会包含If-Modify-Since,该值为缓存以前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。
若是命中缓存,则返回http304,而且不会返回资源内容,而且不会返回Last-Modify。因为对比的服务端时间,因此客户端与服务端时间差距不会致使问题。
既然有这个为何还有4.2 ETag呢?
1. Last-Modified标注的最后修改只能精确到秒级,若是某些文件在1秒钟之内,被修改屡次的话,它将不能准确标注文件的修改时间;
2. 若是某些文件会被按期生成,修改时间变了,但内容没变,但Last-Modified却改变了,致使文件无法使用缓存;
3.有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形。
Etag/If-None-Match返回的是一个校验码(ETag: entity tag)。ETag能够保证每个资源是惟一的,资源变化都会致使ETag变化*。ETag值的变动则说明资源状态已经被修改。服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。
5.总结
https://blog.csdn.net/u012375924/article/details/82806617
从状态码的角度来看,它们的关系以下图:
总结:304就是在过时的但没有失效的状况下,协助缓存的结果。