【问题标题】:Lazy HTTP caching延迟 HTTP 缓存
【发布时间】:2011-02-05 17:33:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: caching html http-caching


    【解决方案1】:

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

    一般的想法是:页面加载的每个资源(图像、脚本、CSS 文件等)都应该有一个唯一的、版本化的 URL。例如,不是加载/images/button.png,而是加载/images/button_v123.png,当您更改该文件时,其URL 将更改为/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)在给定的时间段内从缓存中重新加载父页面,然后再检查服务器。

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

    【讨论】:

    • 您好,您如何看待在资源中添加“版本查询参数”的方法?因此,您将在您的应用程序中拥有一个小的非缓存资源,该资源将返回应用程序的版本,并且您将为每个 url 添加版本(例如:/images/button?version=v124)。这种方法的好处是应用程序服务器端的可维护性。
    • 只要您的服务器可以使用该方法(其中“ok”表示返回的图像没有错误),那么查询字符串可能就可以了。很多年前,我记得听说 AOL 和其他低端 ISP 有攻击性代理服务器,它们可能不会以不同的方式缓存具有不同查询字符串的图像,但希望他们已经停止这样做了。
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2019-05-17
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多