为什么要设置缓存?前端代码打包之后的生成的静态资源就要发布到静态服务器上,考虑到网站的性能和用户体验,设置缓存是必不可少的。
缓存分为强缓存 与协商缓存:
强缓存expires和cache-control 这两个字段,expires这是http1.0时的规范。主要介绍cache-control。cache-control 这是http1.1时出现的header信息。设置强缓存就是服务端在respone header 的cache-control,常见的设置是max-age public private no-cache no-store
-
max-age=xxx,public:客户端在x秒的有效期内,客户端和代理服务器都可以缓存该资源;? -
max-age=xxx,private:客户端在x秒的有效期内,只让客户端缓存;代理服务器不缓存 -
max-age=xxxx,immutable:?如果有请求该资源的需求的话就直接读取缓存,即使用户做了刷新操作,也不向服务器发起http请求 -
no-cache: 跳过设置强缓存,但是不妨碍设置协商缓存; 。 -
no-store: 客户端、服务器都不缓存,也就没有所谓的强缓存、协商缓存了。
注:如果cache-control与expires同时存在的话,cache-control的优先级高于expires
协商缓存如何设置使用?
1.首先每次请求response header都会携带 etag和 last-modified;在下次请求时request header会带上这两个值(If-None-Match ,If-Modified-Since 见备注);
(注)协商缓存有两组报文:1.Last-Modified和If-Modified-Since? ?2.ETag和If-None-Match
2.其次服务端对这两个值进行对比,判断资源是否更改,如果更改就直接返回新的资源,和更新对应的response header的标识etag、last-modified。
3如果资源没有变,那就不变etag、last-modified,这时候对客户端来说,每次请求都是要进行协商缓存。
注:Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
|