延迟HTTP缓存

时间:2011-02-05 17:33:34

标签: caching html5 http-caching

我有一个通过自助服务终端向访问者显示的网站。人们可以与之互动。但是,由于网站不是本地托管的,并且使用互联网连接 - 页面加载速度很慢。

我想实现某种延迟缓存机制,以便当人们浏览页面时 - 页面和页面引用的资源被缓存,以便后续加载同一页面是即时的。

我考虑过使用HTML5离线缓存 - 但它要求我指定清单文件中的所有资源,这对我来说是不可行的,因为网站非常大。

还有其他方法可以实现吗?也许使用HTTP缓存头?我还需要某种方法来使缓存无效,以便将新的更改“推送”到浏览器......

1 个答案:

答案 0 :(得分:2)

处理此类问题的常用方法是使用HTTP缓存标头,并结合智能构建网页引用的资源的URL。

一般的想法是:您的页面加载的每个资源(图像,脚本,CSS文件等)都应该具有唯一的版本化URL。例如,您无需加载/images/button.png,而是加载/images/button_v123.png,当您更改该文件时,其网址将更改为/images/button_v124.png。通常,这是通过URL重写静态文件URL来处理的,因此,例如,Web服务器知道/images/button_v124.png应该真正从Web服务器的文件系统加载/images/button.png文件。创建版本号可以通过附加构建号,使用文件内容的CRC或许多其他方式来完成。

然后,您需要确保在父页面中构建URL的任何位置引用版本化URL。这显然需要用于构造所有URL的动态代码,这可以通过调整用于生成页面的代码或通过影响所有text/html请求的服务器范围插件来完成。

然后,您将所有资源请求(图像,脚本,CSS文件等)的Expires标头设置为远期的日期(例如,从现在开始的10年)。这有效地将它们永久地缓存。这意味着每个页面加载的所有请求将始终从缓存中获取;缓存失效永远不会发生,这是可以的,因为当底层资源发生变化时,父页面将使用新的URL来查找它。

最后,您需要弄清楚如何缓存“父”页面。你如何做到这一点是一个判断。您可以使用ETag/If-None-Match HTTP标头每次检查页面的新版本,如果服务器报告它没有更改,则可以非常快速地从缓存加载页面。或者,您可以使用Expires(和/或Max-Age)在检查服务器之前将缓存中的父页面重新加载一段时间。

如果您想要做更复杂的事情,您可以随时在自助服务终端上放置自定义代理服务器 - 在这种情况下,您可以完全集中控制缓存的完成方式。