HTTP的缓存行为分为:强制缓存和协商缓存。
1.Last-Modified和if-modified-since
last-modified是响应头上的属性,if-modifyed-since是请求头的数据。该属性值需要cache-control配合使用。当再次向服务器发送请求该资源时,会携带if-modified-since的请求头字段,到服务器比对和last-modified是否相同。如果相同则直接返回304,直接使用缓存,如果不相同,则再次请求新的数据,返回200。
2.ETag和if-None-Match
这俩个属性其实和last-modified和if-modified-since类似。不过Etag是服务器更加内容产生的hash字符串,并且Etag是响应头内容。if-None-match是请求头的内容。当再次向服务器发送请求某一个资源时,请求头会携带if-None-match属性,到达服务器后,和Etag进行比对。如果相同,则返回304,如果不相同则返回该资源,并且状态码为200。
3.请求头属性
if-modifyed-since、if-None-match
4.响应头属性
Last-modified、Etag
Expires、Cache-Control
5.浏览器获取缓存的流程图
6.无法被浏览器缓存的请求
- http信息头部cache-control: no-cache,pragma:nocache或者cache-control: max-age=0。
- 根据cookie,认证信息决定输入内容的信息是否可以被缓存。
- 经过https加密的请求。
- post请求无法被缓存
- 在http响应头中不存在last-modified/Etag和cache-control/expires
7.用户行为与缓存的关系
用户在浏览器采用的一些操作,例如,返回上一阶段,下一阶段,刷新页面,强制刷新页面等操作,这些对于一些缓存的属性的影响是不一样的。下面讲进行详细解读:
1.刷新(仅仅是F5刷新)
此时对于cache-control/Expires是不生效的,但是last-modified/Etag都生效的,此时会向服务器发起请求,用来判断目标文件是否发生变化。
2.强制刷新(F5刷新+ctrl)
此时对于cache-control/Expires和last-modified/Etag都不生效,此时,必须从服务器拿到新数据。
3.回车或者转向
此时,所有的缓存都生效。