缓存类型
根据是否要访问服务器而定的。
强缓存 (缓存)
本地缓存。即客户端需要资源无需给服务器发送请求,直接从本地拿。
控制强缓存的报文字段有:Expires、Cache-Control
Expries
设置资源过期时间(绝对时间),如果用户的本地时间发生了错乱,可能会出现问题。如果设置了Cache-control: max-age=过期秒数,Expires会被忽略。
Cache-Control
设置资源过期时长(相对时间),不受本地时间影响。
- Cache-Control:max-age=3600 是什么意思? 服务器告诉浏览器该资源会在本地缓存,如果需要再次请求该资源并且在3600秒之内,那么浏览器无需向服务器发送资源请求。若超出则需要询问服务器是否可以继续在本地使用资源。
- Cache-Control:no-cache 是什么意思? 告诉浏览器资源会在本地缓存,再次需要该资源不能从本地缓存拿。得向服务器确认资源的有效性。相当于 Cache-Control:max-age=0
- Cache-Control:no-store 是什么意思 告诉浏览器资源不被缓存,再次需要该资源时直接发请求,服务器给最新的资源
弱缓存(协商缓存:本地资源过期了是否重新可用)
本地缓存失效,需要向服务器发请求,对比资源是否被修改。来判断本地缓存是否重新可用。若资源未被修改,服务器返回304,告诉浏览器可以再次使用本地缓存了。若资源修改了,服务器返回200,并且带上新资源。
控制协商缓存的字段有:Etag/if-None-Match、Last-Modified/if-Modified-Since
Etag/if-None-Match(标识成字符串)
服务器接受到浏览器的请求,会标记资源生成一个字符串,相当于一个指纹传给浏览器。当文件在服务端被修改时,Etag就会改变。当浏览器再次请求资源并且本地缓存失效的情况下会将此字符串if-None-Match的值传给服务器。对比资源是否被修改。若未修改返回304,有则返回200并带上新的Etag。
Last-Modified/if-Modified-Since(最后修改时间)
服务器给出相应的资源会带上文件最后的修改时间。当浏览器再次发获取该资源的请求的时候会带上这个修改时间(if-Modified-Since的值),对比请求的文件修改时间和真实文件修改时间。判断资源是否过期。
Etag VS Last-Modified
- Last-Modified的单位是秒,如果在一秒内对文件进行修改,使用Last-Modified不变,但Etag一般会发生改变。
- 语义上看:一个是根据资源内容生成字符串,一个是资源修改时间
- 使用Last-Modified暴露了文件信息
谈谈浏览器缓存机制(HTTP如何控制缓存)
以Cache-Control和Etag为例
- 浏览器第一次给服务器发送请求获取资源,服务器响应报文的状态码是200,状态头会带上Cache-Control、Etag 字段,响应体是资源内容,浏览器会将资源放在本地缓存。
- 当浏览器希望再次获取资源时,会先判断本地缓存是否过期(通过判断强缓存 Cache-control过期时长),若是在过期时间之内,则直接使用本地缓存。
- 若超过了过期时长,则要向服务器发送请求询问资源是否依然可以使用。请求报文的头字段是If-None-Match ,即之前响应报文里的Etag。
- 服务器通过If-None-Match里的Etag和新计算的Etag做对比,若匹配,返回状态码为304,不包含响应体的报文。告诉浏览器该资源的本地缓存又可用了。若匹配失败,返回状态码为200带Cache-Control、Etag和新资源的新报文。