HTTP系列: 缓存
在 HTTP1.0 的时候,Expires 有个BUG:
- 如果浏览器的时间不准,那么具体缓存的时间就不准确,这个过期时间应该让浏览器自己算
- 在HTTP 1.1 里面 同时存在
max-age和Expires会使用max-age
如果资源过期了,浏览器要和服务器确认下是否有更新,这么判断呢
-
我们可以通过文件内容的
hash,也可以通过最后修改时间判断,服务器返回资源的时候,就会带上Etaglast-Modified
-
那么浏览器端在
max-age时间到了的时候,就可以带上这个两个,问下资源是否有更新 -
带上
Etag的header叫做:If-None-Match -
带上
last-modified时间的叫做:If-Modified-Since; -
服务端判断文件是否有变化,
- 有变化:返回200
- 无变化: 返回304,浏览器读取缓存
-
如果确定文件时不会变,也不需要协商,可以用
immutable来告诉浏览器。
代理服务器的缓存怎么控制呢
- 浏览器的缓存是用户自己的:叫做私有缓存
- 代理服务器上的缓存大家都可以访问,叫做公有缓存
如果一个资源只想浏览器里缓存,不想再代理服务器上缓存,则设置为 private 否则设置: public
比如这样这是就是资源可以再代理服务器缓存
Cache-control: public, max-age=600, s-maxage:32536000
- 缓存时间为一年(代理服务器的max-age 用 s-maxage 设置)
- 浏览器里面缓存10分钟
这样设置就是只有浏览器可以缓存
Cache-control: provite, max-age=31536000
缓存过期了就完全不能用了吗
Cache-control: max-stale=600
stale 是不新鲜的意思。请求里带上 max-stale=600, 就是说过期10分钟的话还是可以用的,但是再长就不行了
Cache-control: stale-while-revalidate=600
和浏览器协商还没有结束的时候,就先用过期的缓存
Cache-control: stale-if-error=600
如果协商失败的话,就用过期的缓存
Cache-control: max-age=21536000, must-revalidate
缓存失效的话,必须等待验证结束,不能用过期的缓存
HTTP 设置缓存
Cache-control: no-store
设置了 no-store 的指令就不会缓存文件了,也就没有过期时间和之后的协商过程
如果允许缓存,但是需要每次都协商下的话,就用 no-cache
Cache-control: no-cache
no-cache 相当于禁掉了强缓存,每次都需要协商下。
而 must-revalidate 只是在强缓存过期之后,禁止掉了用过期的缓存的过程,强制必须协商
强缓存:浏览器不会像服务器发送任何请求,直接从本地缓存中读取文件并返回Status Code: 200 OK
协商缓存: 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;
\