首先理解强缓存和协商缓存。
1.强缓存
强缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。控制强制缓存的字段分别是 Expires 和 Cache-Control。
2.协商缓存
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。控制协商缓存的字段分别有:Last-Modified / If-Modified-Since(资源修改的时间) 和 Etag / If-None-Match(标识符字符串)。
注:
浏览器第一次发请求,服务器在返回的 respone 的 header 加上 Last-Modified, 表示资源的最后修改时间 。再次请求资源,在 requset 的 header 加上 If-Modified-Since , 值就是上一次请求返回的 Last-Modified 值
一个标识符字符串,表示文件唯一标识,只要文件内容改动,ETag就会重新计算。缓存流程和 Last-Modified 一样。但如果我们打开文件但并没有修改其内容,Last-Modified 也会改变,而Etag则不会改变。
3.304和200
协商缓存主要有以下两种情况:
(1)协商缓存生效,返回304;
(2)协商缓存失效,返回200和请求结果
请求过程:
当客户端第一次请求服务器资源,服务器成功返回资源,这时状态码为200,并在浏览器的缓存中记录下max-age(指定缓存的有效时间)。
当客户端再次请求该资源,客户端首先从缓存中查找该资源。如果该资源存在且在有效期内,则不请求服务器,直接读缓存,也就不会产生对应的请求数据包;如果不在有效期内,则客户端会请求服务器,重新获取。服务器会判断修改时间,如果没有修改过,就会返回状态码304,表示该资源仍然有效,可以直接读取缓存。304状态码返回时,不包含任何响应的主体部分。