如何控制HTTP协议的的缓存跟不缓存



1.HTML META标签和HTTP头信息
 
HTML文件的编写者会在文档的<HEAD>区域中加入描述文档的各种属性,这些META标签常常被用于标记文档不可以被缓存或者标记多长时间后过期。META标签使用很简单,但是效率并不高,因为能够读懂这个标记的浏览器只有少数几种,同时由于中间缓存几乎完全不解析文档中的HTML内容,所以也没有什么中间缓存(代理缓存和网关缓存)能读懂这个规则。如果要通过META标签来控制页面不缓存,一般情况下会在web页面的<HEAD>区域中增加“Pragma:no-cache”的META标记。
 
2.使用Expires(过期时间)头信息来控制保鲜期
 
通常情况下,主要通过HTTP头信息来指示缓存和控制内容是否缓存。这些控制信息在HTML代码中是看不见的,一般由Web服务器自动生成,并在HTTP消息中进行标识。
 
代码中包含了Expires头,指示Mon,18Jul201123:14:49GMT为过期时间。Expires方式是HTTP控制缓存的基本手段,这个属性告诉缓存相关内容在多长时间内是新鲜的。过了这个时间,如果客户端向缓存请求这个内容,缓存就会向源服务器发送请求,检查文档是否发生了变化。几乎所有的缓存服务器都支持Expires方式。大部分Web服务器设置Expires方式有多种,最常用的是设置成一个绝对的时间值,比如将内容最后被修改的时间点加上一个特定的时间段(比如1个小时)所得到的时间值。
 
Expires头信息对于控制静态图片文件的缓存特别有用,因为这些图片修改很少,可以给它们设置一个特别长的过期时间,这样会使得你的网站访问速度非常快。另外,它们对于控制有规律改变的网页也很有用,例如每天早上6点更新新闻网页,可以设置副本的过期时间也是这个时间,这样缓存就知道什么时候去取一个更新版本,而不必让用户不停地“刷新”了。
 
Expires头信息属性值只能是HTTP格式的日期时间,其他的都会被解析成当前时间“之前”,即表示此内容已经过期,HTTP的日期时间必须是格林尼治时间(GMT),而不是本地时间。
 
虽然过期属性非常有用,但它还是有些局限,首先是源服务器的时间和中间缓存的时间必须是同步的。如果彼此不同步,则会出现应该缓存的内容提前过期了,或者已经过期的结果没有及时更新。其次是过期时间的设置也存在一定的问题。如果设置的过期时间是一个固定的时间,而返回内容的时侯没有更新下次过期的时间,那么之后所有访问请求都需要重新发给源Web服务器,这样反而增加了服务器的负载以及响应时间。
 
3.验证
 
在HTTP11中对缓存提出了验证的概念,验证的目的就是检验缓存内容是否可用。当中间缓存存在一个过期的缓存内容,并且对应的访问请求到达时,缓存应该首先向源服务器或者其他保存有未过期的缀存服务器请求验证来确定本地的缓存内容是否可用。这个过程就是一个缓存消息的验证过程。
 
HTTP11把这种验证后再决定是否返回消息内容的方式叫“有条件”的请求返回方法,这样可以避免从源服务器或其他缓存服务器获取整个内容的信息,从而减少网络流量。当源服务器生成了一个完整的响应消息时,它会附带一个验证信息,中间缓存在缓存内容时可以保存这个验证信息,当缓存内容过期以后,中间缓存可以使用它生成一个“有条件”的请求来向源服务器请求验证。而源服务器或者在与源服务器通信的路径上的其他缓存服务器(如果保存有未过期的内容)在收到这样的请求以后就可以将请求中包含的验证信息与自己本地的验证信息进行比较。如果两个验证信息相等,那么返回一个带有特定状态码(比如304 Not modified,表示内容未修改过)且消息主体内容为空的响应消息,在这种情况下就减少了网络流量;如果两个验证信息不相等就需要传输一个包含新内容的完整响应消息。
 
4.cache-control(缓存控制)HTTP头信息
 
指定过期时间和验证是HTTP11的基本缓存机制,也是缓存的隐含指令。但是在某些情况下,服务器或客户端可能需要给HTTP缓存提供显式的指令。因此,HTTP1.1介绍了cache-control响应头信息来让网站的发布者可以更全面地控制他们的内容,并对过期时间进行限制。有用的Cache- Control响应头信息包括如下几项:
 
(1)max-aged缓存内容保持新鲜状态的最长时间。这个属性类似于过期时间,是基于请求时间的相对时间间隔,而不是绝对过期时间,单位是秒,即从请求时间开始到过期时间之间的秒数。
 
(2)s-maxage。类似于max-age属性,它应用于共享缓存。
 
(3)pubi。此属性标记认证内容也可以被缓存,一般来说,经过HTTP认证才能访问的内容是默认不能缓存的。
 
(4)no-cache。强制将每次访问请求直接发送给源服务器,而不经过中间缓存进行前面提到的验证这对那些需要在源服务器进行用户认证的应用非常有用,也适用于那些严格要求使用最新数据的应用。
 
(5)no-store。强制缀存在任何情况下都不要级存任何内容。
 
(6)must-revalidate。告诉缓存必须遵循源服务器赋予的内容新鲜度。由于HTTP允许缓存在某些特定情况下返回过期数据,所以通过指定这个属性,源服务器可以告诉缓存,如果缀存内容处于过期状态,则在对访问请求进行响应前必须到源服务器进行重新验证。
 
(7)proxy-revalidate。proxy-revalidate和 must-revalidate基本相同,只是它不能应用于非共享的代理缀存。它允许在客户端缀存中保存那些经过权限认证的响应消息(包含有“public"来保证它们可以被缓存),在缓存内容没有过期之前,遇到相同的访问请求则可以返回缓存的数据而无须经过源服务器的验证,如果内容过期则仍需经过服务器重新验证。对于服务于多个用户的代理缓存来说,为了保证每个用户都是被授权的,仍需每次都去服务器进行验证(这样的授权响应同样需要使用public指令来允许它们能够被缓存)。
 
5.Pragma http头信息
 
除了以上提到的几种典型缓存控制机制以外,还有一种使用Pragma http头信息的方式。Pragma属于通用头,用来包含特定的执行指令,这些指令可以适应于客户端、代理、网关、源服务器中的任何接收者,但是HTTP协议中认为Pragma指令规定的行为是可选的。
 
当“Pragma:no-cache出现在请求消息中时,即使缓存设备中缓存了此请求响应所需的内容,也会直接将此请求转发到源服务器上。虽然在 HTTP1.1中提到了通过Pragma控制缓存的方法,但这主要是为了向HTP10兼容,因为支持HTTP1.0的缓存主要还是通过这种方法来控制内容缓存的。HrTP1.1中主要还是通过cache-control头信息来控制缓存,所以协议要求当个HTTP11的请求从客户端发出时,既应该包含Pragma指令,也应该包含cache-control的控制指令,这样,请求从客户端发给源服务器的过程中,分别支持HTTP11和HTTP1.0的缓存设备都可以读懂指令的信息。如果发送请求的客户端本身只支持HTTP1.0,那么支持HTTP11的中间缓存在收到请求消息后必须以 Pragma中的指令来控制缓存。
 
很多人认为在HTTP头倌息中设量了“Pragma:no- cache"后会让内容无法被缀存。但事实并非如此,HTTP的规范并没有任何关于响应信息头Pragma属性的说明,而讨论的都是请求头信息的Pragma属性,即头信息由浏览器发送给服务器,实际上只有少数几种缓存服务器会遵循请求消息中的这个头信息。所以,在很多情况下,使用 Pragma属性不一定管用。
 
CDN互联专业提供国内外高防cdn加速服务
 
 
上一篇:ddos学习
下一篇:最后一页