缓存
HTTP 缓存
缓存方法
HTTP缓存,一般包括浏览器缓存和代理服务器缓存,缓存header以前使用pragma,这个是 HTTP1.0的标准,后来HTTP 1.1 之后,大家普遍使用 Cache-Control 的header了,只有在需要兼容 HTTP 1.0的客户端的时候,才需要使用 Pragma,否则只用 Cache-Control就可以了。
shared cache:指的是代理服务器,CDN等的缓存
private cache:指的是本地缓存
Cache-Control
max-age
缓存的有效期多少秒,由服务器开始产生response的时候开始计时,并非浏览器收到开始计时.
那浏览器如何能知道服务器什么时候产生response呢?如果服务器发送reponse的时候,有Date header,可以直接用这个header获得。
如果没有Date header,浏览器一般会通过一些其他的途径(Chrome为例):比如本地的响应时间戳,计算 tcp RTT(多个请求的rtt采样计算),或者加入一个 fuzz factor(在过期时间上加一个随机噪音值),甚至每次请求刷新(后续请求会带来新的响应时间戳或过期时间)进行计算。通过这些方法的综合,Chrome浏览器能够尽量准确且保守的计算 max-age 过期时间,在错误累积到不可接受的程度前就会得到修正
s-maxage
类似于 max-age,指的是当缓存还有效的时候,它特定于共享缓存,如果和 max-age参数共同存在的时候,将忽略 max-age
no-cache
这个并非不让浏览器缓存,而是一般和 Last-Modified 和 Etag一起使用,如果文件没有变更,则直接使用本地的缓存,并收到304 Not Modified 的响应,如果变化,则更新文件,并收到 200 OK
no-store
这个是真正的不缓存,无论是本地浏览器,还是代理服务器,都不缓存
private
这个指的是,只有浏览器可以缓存,代理服务器不能缓存。比如一些个性化设置,尤其是当登录之后,基于cookie或者session的个性化设置(登录的主页图片等)
public
默认情况下,带有Authorization header的请求,是不会被缓存到共享存储中的,但是如果将请求标志为public,那么是可以缓存的
immutable
当缓存文件依然有效时,则不向服务器请求更新。现代web系统中,一般对于静态文件,会在文件名上面包含版本或者hash信息,而不是直接在原始文件中做修改。在需要使用新版本文件的时候,直接访问新版本文件的地址,这种模式叫 cache-busting 模式.
如果将缓存设置为 immutable,那么在 max-age 的指定时间内,就不会去发送请求验证资源是否有更新,有助于CDN对资源进行缓存,也能节省带宽
Last-Modified/ETag 和 If-Modified-Since/If-None-Match
在有 Cache-Control: max-age=12345678 的时候,这个过期时间比较长,通过 Last-Modified 或者 ETag的header,可以配合 If-Modified-Since或 If-None-Match 的请求头使用,来判断在 max-age依然有效的时间内,是否要更新缓存
在Last-Modified 过期后,发送If-Modified-Since的header,然后服务器再返回 304 或者200更新文件
如果Last-Modified 和 ETag同时存在,那么优先使用ETag。ETag更精确,不受时钟影响,能用于字节级比较(字节级比较指的是:如果资源有小范围更新,ETag可以检测具体字节的变化,Last-Modified只能告知整体是否更改),ETag还支持强缓存,Last-Modified只能协商缓存。Last-Modified可以作为后备机制。
最后更新于