浏览器缓存分为三种情况:
1、200 from cache
本地缓存,浏览器直接从本地缓存的内容获取响应,根本没向服务器发送请求。
2、304 not modified
协商缓存,浏览器在本地没有命中的情况下,在请求头中发送一定的校验数据给服务端,如果服务端数据没有改变,返回304,告诉浏览器从本地缓存响应即可。
304返回的只是一些基本的响应头信息,数据量比较小,没有响应实体部分。
3、200 ok
如果以上两种缓存策略全都失败,那服务器只能返回完整响应。因为没有用到缓存,所以这种情况响应是最慢的。
下面详细说一下本地缓存与协商缓存。
本地缓存
本地缓存就是把内容保存在本地,用的时候直接拿出来用,不用再去服务器请求了。
本地缓存主要有以下几个响应头:
1)pragma
这个字段比较老了,是1.0时代的遗留产物。
如果该字段设置为no-cache时,就是告知浏览器禁用本地缓存,每次都向服务器发送请求。
2)expires
这个字段表示过期时间,对应的值是一个具体的时间点,如果还没到这个时间点,则表明缓存还有效,不需向服务器发送请求。
它也是一个老字段,是1.0的产物。
3)cache-control
这个头比较关键,应该重点掌握。
cache-control的值常用的有如下几个:
cache-control:no-store
禁止浏览器缓存响应。
cache-control:no-cache
不允许直接使用本地缓存,需发起请求和服务器协商。
注意,这个很容易让人产生误解,使人误以为是响应不被缓存。实际上,cache-control: no-cache是会被缓存的,只不过每次都需要向服务器发送请求验证。
cache-control:max-age=3600
浏览器本地缓存有效的最长时间,以秒为单位。
前两个字段虽然是老字段,不过确实还在沿用,他们的优先级是:
pragma > cache-control > expires
协商缓存
协商缓存就是需要跟服务器做一次交互,协商一下缓存策略。
相关的请求头有如下几个:
1)if-modified-since
我们把请求头的last-modified字段,通过if-modified-since提交给服务器检查,如果修改时间是一致的,那就是没有修改,返回304。
2)etag
这是http1.1的字段,表示文件指纹标识符,如果文件内容被修改了,指纹信息会跟着变。
注意,这个是响应头带过来的信息。
3)if-none-match
如果本地缓存策略失效,会将etag信息通过if-none-match发送给服务端,服务端会判断文件是否改变,如果没有改变,直接使用本地缓存,返回304。
网友评论