HTTP之如何控制缓存

HTTP控制缓存的能力

===================摘自《HTTP权威指南》====================================

服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:

(1)、附加一个Cache-control:no-store首部到响应中去;

(2)、附加一个Cache-control:no-cache首部到响应中去;

(3)、附加一个Cache-control:must-revalidate首部到响应中去;

(4)、附加一个Cache-control:max-age首部到响应中去;

(5)、附加一个Expires日期首部到响应中去;

(6)、不附加过期信息,让缓存确定自己的过期日期;

1、no-store与no-cache响应首部

HTTP/1.1提供了几种限制对象缓存,或限制提供已缓存对象的方式,以维持对象的新鲜度。No-store首部和no-cache首部可以防止缓存提供未经证实的已缓存对象:

 

Pragma:no-cache

Cache-control:no-store

Cache-control:no-ca

 

标识为no-store的响应会禁止缓存对响应进行复制。缓存通常会像非缓存代理服务器一样,向客户端转发一条no-store响应,然后删除对象。

标识为no-cache的响应实际上是可以存储在本地缓存区中的。只是在与服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。这个首部使用do-not-serve-from-cache-  without-revalidation这个名字会更恰当一下。

HTTP/1.1提供了pragma:no-cache首部是为了兼容HTTP/1.0+。除了与只理解pragma:no-cache的HTTP/1.0应用程序进行交互时,HTTP/1.1应用程序都应该使用Cache-control:no-cache。

2、max-age响应首部

Cache-control:max-age首部表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数。还有一个s-maxage首部(注意maxage的中间没有连接字符),其行为与max-age类似,但仅使用与共享(公有)缓存:

 

Cache-control:max-age=3600

Cache-control:s-maxage=3600

服务器可以请求缓存不要缓存文档,或者将最大使用期设置为零,从而在每次访问的时候都进行刷新:

 

Cache-control:max-age=0

Cache-control:s-maxage=0

 

3、Expires响应首部

不推荐使用Expires首部,它指定的是实际过期日期而不是秒数。HTTP设计者后来认为,由于很多服务器的时钟都不同步,或者不正确,所以最好还是使用剩余秒数,而不是绝对时间来表示过期时间。可以通过计算过期值和日期值之间的秒数差来计算类似的新鲜生存期:

 

Expires:Fri,05 Jul 2002,05:00:00 GMT

有些服务器还会回送一个Expires:0响应首部,试图将文档置于永远过期的状态,但这种语法是非法的,可能给某些软件带来问题。应该试着支持这种结构的输入,但不应该产生这种结构的输出。

4、must-revalidate响应首部

可以配置缓存,使其提供一些陈旧(过期)的对象,以提高性能。如果原始服务器希望缓存严格过期信息,可以在原始响应中附加一个cache-control:must-revalidate首部。

 

cache-control:must-revalidate

cache-control:must-revalidate

响应首部告诉缓存,在事先没有跟原始服务器再验证的情况下,不能提供这个对象的陈旧副本。缓存仍然可以随意提供新鲜副本。如果在缓存进行must-revalidate新鲜度检查时,原始服务器不可用,缓存就必须返回一条504Gateway Timeout错误。

5、试探性过期

如果响应中没有Cache-control:max-age首部,也没有Expires首部,缓存可以计算出一个试探性最大使用期。可以使用任意算法,但如果得到的最大使用期大于24小时,就应该向响应首部添加一个Heuristic Expiration Warning(试探性过期警告,警告13)首部。据我们所知,很少有浏览器会为用户提供这种警告信息。

6、客户端的新鲜度限制

Web浏览器都有Refresh(刷新)或reload(重载)按钮,可以强制对浏览器或代理缓存中可能过期的内容进行刷新。Refresh按钮会发布一个附加了Cache-control请求首部的Get请求,这个请求会强制进行再验证,或者无条件的从服务器中获取文档。Refresh的确切行为取决于特定浏览器、文档以及拦截缓存的配置。

客户度可以用Cache-control请求首部来强化或放松对过期时间的限制。有些应用程序对文档的新鲜度要求很高(比如人工刷新按钮),对这些应用程序来说,客户端可以使用Cache-control首部使过期时间更严格。另一方面,作为提高性能、可靠性或开支的一种折中方式,客户端可能会放松新鲜度要求。表7-4对Cache-control请求指令进行了总结:

 

 

posted @ 2019-03-05 20:02  小菜鸡1枚  阅读(1023)  评论(0编辑  收藏  举报