Http头中与缓存相关的参数有Pragma\Cache-Control\Expires\Last-Modified\If-Modified-Since,此处的缓存主要指反向代理缓存(如Varnish、SQUID等)。
术语解释:
- 资源(Resource):一种网络数据对象或服务,可以用URI指定。
- 服务器(Server):它同意请求端的链接,并发送响应(response),任何给定的程序都可能既做客户端有做服务器。
- 源服务器(Origin Server):存在资源或者资源在其上被创建的服务器(Server),叫源服务器(Origin Server)
- 年龄(Age):一个响应的年龄是从被原服务器发送或成功验证到现在的时间。
- 保鲜寿命(Freshness Lifetime):一个响应产生到过期之间的时间。
- 陈旧(Stale):一个响应的年龄(Age)超过了他的保鲜年龄(Freshness Lifetime),那么就是陈旧的。
- 保鲜(Fresh):陈旧的反义词。
- 缓存(Cache):缓存是程序响应消息的本地存储。缓存是一个子系统,控制消息的存储、获得和删除。
- 客户端(Client):为发送请求建立连接的程序。
Cache-Control:
Cache-Control 是一个常用头域,用于指定所有属于请求/响应链上的缓存机制(Varnish、SQUID等)必须遵守的指令,指令的指定行为目的是避免缓存造成对请求或响应的不利干扰。 这些指令通常会覆盖默认的缓存算法。缓存指令是单向的,在一个请求中设置的缓存指令并不意味这在响应头中也可以得到相同的指令。
Http头参数格式:
Cache-Control: value
请求头可能参数值:
- no-cache 响应必须从源服务器(Origin Server)返回,不使用缓存
- no-store 缓存(Cache)不应该存储任何客户端请求以及服务器响应
- max-age=delta-seconds 表明客户端(Clinet)愿意接受一个年龄(Age)不大于指定秒数的缓存
- max-stable[=delta-seconds] 表明客户端(Client)愿意接受一个陈旧(Stable)的缓存,但如果指定了秒数,缓存的年龄(Age)不能超过指定秒
- min-fresh=delta-seconds 表明客户端(Client)愿意接受一个保鲜寿命(Freshness Lifetime)大于年龄(Age)加上指定的秒数
- no-transform 不转变消息主体
- only-if-cached 只有当缓存(Cache)有对应被缓存的数据才返回数据,不应该去检索源服务器(Origin Server)查看是否有新备份存在
响应头可能参数值:
- public 表明响应可以被任何缓存(Cache)保存。
- private 表明全部或部分的响应消息是留给单独用户的,不能缓存在公有的缓存中
- no-cache 响应必须从源服务器(Origin Server)返回,不使用缓存
- no-store 缓存(Cache)不应该存储任何客户端请求以及服务器响应
- no-transform 不转变消息主体
- must-revalidate 缓存(Cache)必须在使用文档前验证是否过期,过期不应该被使用
- proxy-revalidate 通must-revaliadate
- max-age=delta-seconds 表明客户端(Clinet)愿意接受一个年龄(Age)不大于指定秒数的缓存
- s-maxage=delta-seconds 这个指令指定的秒数会覆盖max-age指令或Expires头,总是忽略私有缓存
注意:
- Http/1.0 可能没有实现Cache-Control参数,只实现了Pragma: no-cache
技巧:
- 当浏览器展示的页面不是我们所预期的,通常先考虑是不是缓存原因,可以使用ctrl + F5(FireFox、chrome都可用)强制刷新,将会在请求头中加入Pragma:no-cache和Cache-Control:no-cache
忽然发现网上有Http协议的中文PDF,写的非常详细,所以本博客到此结束,有兴趣请参考一下地址:
w3c Http Header Field :
Http tutorials :
Http协议中文PDF :