CDN算是个挺有意思的技术,不同于代理缓存,CDN的网关缓存和被缓存的Web站点的利益是一致的,因此,上面提到的问题对于CDN而言是没有的。不过,即使你使用了CDN,你仍要顾虑下游的代理和浏览器缓存。

  以上为缓存可能的“糟粕”,那他好的地方呢?缓存可以让你的Web站点加载更快,让你的服务器和互联网链接间负担更小。这种差异会导致一些类似质的 变化,一个网站要几秒钟才能加载出来,而另外一个充分发挥缓存的优势,几乎瞬间显示。用户自然更喜欢那个加载迅速的站点,访问也更多。

  再说个现实示例,许多大型互联网公司花费了数百万美元,在世界各地设立服务器集群来复制他们的内容,以使其尽可能快被他们的用户访问。缓存为你做同样的事情,而且他们更接近终用户。重要的是,你不要花银子。

  实际上呢,无论你喜欢与否,代理和浏览器缓存都会被使用。如果你站点的缓存配置不正确,你只能听天由命了。

  Web缓存如何工作

  所以的缓存都有一套自己的规则,可以用来决定何时跟缓存暧昧往来。其中部分规则设定在协议中(HTTP 1.0 以及 1.1),部分由缓存管理员⑤设置。

  ⑤缓存管理员:如果指的是浏览器缓存,则有可能是我们服务器专家同事,在服务器上配置一些缓存规则;如果是代理缓存,则指的是处理代理服务器这块的管理人员。

  一般而言有如下常用规则N:

  响应头明确说明,偶不想被缓存,则不会被缓存;

  如果请求信息是需要认证或者安全加密的(如, HTTPS),相应内容也不会被缓存;

  缓存如果有以下表现,则认为是fresh新鲜的(无需检查源服务器,直接发送给客户端):

  含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内,或者

  缓存近已展现,并且在不久前修改。

  则内容缓存直取,绕过源服务器。

  若内容陈旧,则会要求源服务器做验证 validate ,或者告诉缓存其拷贝副本是否是OK的。

  特定情况下——例如,断网了,之前有过的响应缓存直取而不检查源服务器。

  响应如果没有类似ETag或Last-Modified头这样的校验器,也没有明确的更新信息,通常(并不)认为是不可缓存的。

  总而言之,新鲜度freshness和校验validation是确定缓存内容是否可用的重要途径。如果要展示的足够新,直接缓存取;如果检测发现展示内容并未变化,则不会再来一次完整的传输。

  如何控制缓存和不缓存

  有很多工具可以帮助设计师和网站管理员调整服务器缓存网站的方式,这也许需要你亲自动手对服务器的配置进行一些调整,但值得。了解如何使用这些工具请参考本文后面的章节。

  HTML Meta标签 vs. HTTP头信息

  HTML重构人员可以在文档的中添加标签进行描述。这些meta标签通常用来标记不可缓存或过期时间。

  Meta标签使用简单,但效果一般。因为只被少数几个浏览器宠幸,而代理缓存基本上不访问HTML文档。尽管我们可以在页面上试图添加no-cache meta标签让页面一直是新的,但其实没必要。

  如果你的网站托管在ISP或者主机托管商那里,并且他们没有赋予您任意设置HTTP头信息的能力(比如Expires和Cache-Control),你要投诉争取,因为在你的工作中这些是必须的。

  另外一方面: HTTP头信息可以让你对浏览器和代理服务器如何处理你的副本进行更多的控制。他们在HTML代码中是看不见的, 一般由Web服务器自动生成。但是,根据你使用的服务器,你可以在某种程度上进行控制。在下文中:你将看到一些有趣的HTTP头信息,以及如何在你的站点 上应用部署这些特性。

  HTTP头信息发送在HTML代码之前,只能被浏览器和一些中间缓存能看到,一个典型的HTTP 1.1协议返回的头信息看上去像这样:

  HTTP/1.1 200 OKDate: Fri, 30 Oct 1998 13:19:41 GMTServer: Apache/1.3.3 (Unix)Cache-Control: max-age=3600, must-revalidateExpires: Fri, 30 Oct 1998 14:19:41 GMTLast-Modified: Mon, 29 Jun 1998 02:28:12 GMTETag: "3e86-410-3596fbbc"Content-Length: 1040Content-Type: text/html

  头信息空一行后是HTML代码的输出,关于如何设置HTTP头信息请参考对应章节。

  Pragma HTTP头信息(以及为什么不起作用)

  很多人认为在HTTP头信息中设置了Pragma: no-cache后会让内容无法被缓存。但事实并非如此:HTTP的规范 中,响应型头信息没有任何关于Pragma属性的说明,只说明了请求头信息(浏览器发送给服务器的头信息)中的Pragma属性。虽然有少部分缓存会买 账,但大部分无视,使用Pragma没作用。若要使用,试试下面的头信息。

  使用Expires HTTP头信息控制不过期

  Expires HTTP头是控制缓存的基本手段,Expires的中文意思是“有效期”,显然,是告诉浏览器缓存的有效期。如果过期,缓存会检查源服务器以确定文件是否改变了。Expires头几乎每个缓存都支持。

  大部分的服务器允许你以多种方式设置Expires响应头。通常,他们允许设置一个过期时间,然后对比后一次访问的时候或者后一次文档修改的时候决定客户端内容的获取方式。

  对于静态图片(如导航或按钮的图片)而言,Expires头信息是相当有用的,因为图片不怎么修改,您可以给图片设置一个相当长的过期时间,这回让 你的用户感觉网站变快了。Expires对于控制有改变规律的网页也很有用,例如:你有一个新闻聚合页面,每天早上6点钟准时更新,您可以设置缓存的过期 时间也是这个点,于是缓存可以很聪明地知道什么时候该去重载新的内容,什么时候睡大觉。