22 | 冷链周转:HTTP的缓存代理
HTTP的缓存代理就是提供缓存服务的代理服务器,由于它处于HTTP传输路径的中间位置,所以它兼具Cache-control在服务器,客户端2个方向的设置,同时又特有代理服务器的若干缓存配置属性。
缓存是怎么来的?
缓存是某次用户的直接或间接请求,存储在客户端或缓存代理服务器上的某个URI标识的资源。
缓存策略按方向可以分为WEB服务器缓存策略,客户端缓存策略。
WEB服务器缓存策略应用到客户端和缓存代理服务器,是一组Cache-Control的设置,且并不会区分接收对象。客户端,缓存代理接收到的缓存策略是一样的,需自行甄别,如某些针对缓存代理的设置,客户端忽略即可。
类似的,客户端的缓存策略由缓存代理和服务器执行。
服务器端,根据存储策略的不同,缓存可以区分为private,public,标记为private的缓存不允许存储在缓存代理上,public则可以,所以private仅请求者可用,public所有客户端可用。
缓存代理和非缓存代理相比,增加了几个缓存控制的头字段
- private/public
- no-transform, 即不允许对资源做格式转换
- proxy-revalidate, 这个在客户端生效,即public缓存回源仅回到缓存代理,而不去源服务器。
客户端Cache-Control头字段应用到服务器和缓存代理
only-if-cached,只接受缓存,否则返回504
max-age,表示只接受age<max-age的缓存
max-stale,可接受的过期时间
min-fresh,至少剩余的保鲜时间
补充:
关于must-revalidate和proxy-revalidate
proxy-revalidate的意思似乎是针对存储在本地的共享缓存的验证策略,如果过期,则回代理验证。【补充2:这个结论是错误的,proxy-revalidate和must-revalidate的区别在于proxy-revalidate针对共享缓存,所以它应用在proxy上,所以类似must-revalidate,代理服务器的缓存过期后,需要回源服务器验证。】
must-revalidate
Indicates that once a resource becomes stale, caches must not use their stale copy without successful validation on the origin server.
proxy-revalidate
Like must-revalidate, but only for shared caches (e.g., proxies). Ignored by private caches.
课后作业
加入了代理后 HTTP 的缓存复杂了很多,试着用自己的语言把这些知识再整理一下,画出有缓存代理时浏览器的工作流程图,加深理解。
客户端发起请求时先检查是否有本地缓存,缓存是否过期,根据缓存策略,决定是否发送报文
proxy-revalidate, max-age>0, 不发消息,直接用本地缓存
proxy-revalidate, max-age <=0, 发消息,如果s-maxage>0,用代理缓存,否则由代理向源服务器发起请求
no-store,不用缓存
no-cache,源服务器验真
must-revalidate, 过期源服务器验真
缓存的时间策略很重要,太大太小都不好,你觉得应该如何设置呢?
频繁变动的资源max-age时间设短一点,反之长一点