服务器可以通过http定义的几种header对可以缓存数据的存在时间进行控制,按照其优先级由高到低分别为:
- cache-control:no-store
- cache-control:no-cache
- cache-control:must-revalidata
- cache-control: max-age=
- expires:{date}
- 不附加任何信息
cache-control:no-store 首部会禁止缓存对于响应进行复制,响应由服务器回送出,然后由缓存转发到客户端,转发完毕后会把缓存上的响应副本删除。
cache-control:no-cache 实际上是允许响应缓存在本地缓存中的,只不过要使用缓存中的文件,则必须与原始服务器通信,验证缓存内容是否足够新鲜。如果足够新鲜才可以会送给客户端使用。
cache-control:must-revalidata 有些缓存为了提高性能,会选择性的向客户端提供一些过期的数据。must-revalidata首部告诉缓存,如果要提供过期的数据给客户端,则必须向服务器验证数据的新鲜度,验证通过才可以使用过期的数据。缓存可以自由的向客户端提供新鲜的数据。
cache-control:max-age 该首部表示从服务器将数据传输过来的时间点起,可以认为该数据新鲜的秒数。服务器可以将max-age设置为0,从而让每次访问时缓存都进行刷新。
cache-control:max-age=0
expires:{date} 该首部直接设置缓存的过期日期。由于很多服务器的时钟都不同步,使用绝对的时间点设置过期时间可能出现问题。
客户端控制缓存新鲜度
浏览器都有刷新或者重载按钮,可以强制浏览器或者代理缓存对可能过期的内容进行刷新。刷新按钮会在请求header中加入cache-control首部,这个请求会强制进行再验证,或者直接从原始服务器获取资源。刷新的确切行为会依浏览器类型而不同。
客户端cache-control请求指令
cache-control:max-stable={s} | 缓存可以随意提供过期的数据,如果指定了{s},则告知缓存在{s}这个时间段内,数据不能过期。 |
cache-control:mini-fresh={s} | 至少在未来{s}秒内,缓存提供的数据必须是新鲜的。 |
cache-control:max-age={s} | 缓存不可以返回缓存时间超过{s}秒的数据。 |
cache-control:no-cache | 客户端只接受进行过新鲜度再验证的缓存数据或者直接从服务器返回的数据。 |
cache-control:no-store | 缓存应该删除所有客户端相关的缓存数据。 |
cache-control:only-if-cached | 只有缓存中有数据副本,客户端才会获取一份副本。 |
html中的http-equiv
为了让方便在网站项目中控制缓存,html提供了标签,这个标签可以设置与文档有关的header。
1 2 3test 4 5 6 ......
该标签可以在请求中插入一个首部字段,首部名称由属性http-equiv 设置,首部内容由content设置。
这个标签让我们可以让我们在页面中方便的设置响应首部,但是由于解析这个元素会给服务器增加额外的负担,所以只有很少web服务器和代理支持这个特性。因此,不建议通过设置这个标签来控制缓存,正确的配置header中的字段才是可靠的缓存控制方法。