Http缓存
缓存,加速客户端响应,减轻服务器负担,下面简单介绍4种缓存策略.
1.Cache-Control 通用消息头被用于在http 请求和响应中通过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求设置的指令,在响应中不一定包含相同的指令。
2.Expires 头指定了一个日期/时间, 在这个日期/时间之后,HTTP响应被认为是过时的;如果还有一个 设置了 "max-age" 或者 "s-max-age" 指令的Cache Control响应头,那么 Expires
头就会被忽略。
3.ETag 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web服务器不需要发送完整的响应。
4.Last-Modified
是一个响应首部,其中包含源头服务器认定的资源做出修改的日期及时间。 它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 Etag要低,所以这是一个备用机制。包含有 If-Modified-Since
或 If-Unmodified-Since
首部的条件请求会使用这个字段。
Cache-Control 与 Expires 作用一致,都是指当前资源的有效期,控制浏览器是否直接从浏览器获取数据还是重新发送请求到服务器取数据。但Cache-Control 的选择更多,设置更细致,如果同时存在的话,优先级高于 Expires
ETag与Last-Modified作用一致,都是询问服务器请求的资源是否修改,如果没修改则服务器不返回响应体,浏览器直接从缓存中获取.但是,Last-Modified比ETag设置的时间粒度要粗一些,是秒级别的,如果是一秒内发生多次修改,则无法判断出来,而Etag则不同.
Cache-Control/Expires的优先级要高于Last-Modified/ETag。即当本地副本根据Cache-Control/Expires发现还在有效期内时,则不会再次发送请求去服务器询问修改时间(Last-Modified)或实体标识(Etag)了。
更细致的优先顺序:Cache-Control>Expires>Etag>Last-Modified
一般情况下,使用 Cache-Control/Expires 会配合 Last-Modified/ETag 一起使用,因为即使服务器设置缓存时间, 当用户点击“刷新”按钮时,浏览器会忽略缓存继续向服务器发送请求,这时 Last-Modified/ETag 将能够很好利用 304 ,从而减少响应开销。
是否使用缓存,最终由用户的操作来决定,比如我用火狐测试,直接输入网址,如果之前访问时响应头中有缓存策略,则火狐会使用缓存策略,不发起对资源的请求,但是我刷新时,Chrome就直接向服务器发起请求,并发出If-Modified-Since或者If-None-Match(假设上次服务器返回了last-modified或者ETag).
参考资料