caching - 惰性 HTTP 缓存

标签 caching html http-caching

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

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

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

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

最佳答案

处理此类问题的常用方法是使用 HTTP 缓存 header ,并结合为页面引用的资源智能构建 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 来自网络服务器文件系统的文件。可以通过附加内部版本号、使用文件内容的 CRC 或许多其他方式来创建版本号。

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

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

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

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

关于caching - 惰性 HTTP 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908395/

相关文章:

java - 从列表中清除应用程序缓存

html - 如何在html中行中使用<hr>?

javascript - Opera SDK开发

java - 我正在尝试使用 Java 的 HttpURLConnection 来执行 "conditional get",但我从未获得 304 状态代码

caching - 您如何测试 Varnish 配置或一般的缓存层

java - Java Applet 中的缓存

rest - REST 集合和单个项目的缓存注意事项

python - 将 scrapy 项目部署到 scrapyd 时 HTTPCACHE 不起作用

javascript - 显示缓存中存储的内容

JavaFx Webview HTML5 拖放