2

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

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

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

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

4

1 回答 1

2

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

总体思路是:页面加载的每个资源(图像、脚本、CSS 文件等)都应该有一个唯一的、版本化的 URL。例如,您将加载而不是加载/images/button.png/images/button_v123.png当您更改该文件时,其 URL 更改为/images/button_v124.png. 通常这是通过对静态文件 URL 进行 URL 重写来处理的,例如,Web 服务器知道/images/button_v124.png应该真正/images/button.png从 Web 服务器的文件系统加载文件。可以通过附加内部版本号、使用文件内容的 CRC 或许多其他方式来创建版本号。

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

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

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

如果您想做一些更复杂的事情,您总是可以在信息亭上放置一个自定义代理服务器——在这种情况下,您可以完全集中控制缓存的完成方式。

于 2011-02-05T18:58:31.193 回答