我有一个网站,这是通过一个信息亭显示给游客。人们可以与之互动。然而,由于网站不是本地托管的,并且使用互联网连接-页面加载速度很慢。
我想实现某种懒惰的缓存机制,这样当人们浏览页面时-页面和页面引用的资源都会被缓存,以便相同页面的后续加载是即时的。
我考虑过使用HTML5离线缓存-但它需要我在清单文件中指定所有资源,这对我来说是不可行的,因为网站太大了。
有没有其他方法来实现这一点?也许使用HTTP缓存头?我还需要一些方法来在某个时候使缓存无效,以便将新的更改“推”到浏览器中……
发布于 2011-02-06 02:58:31
处理此类问题的常用方法是使用HTTP缓存头,并结合智能构造页面所引用资源的URL。
一般的想法是这样的:页面加载的每个资源(图像、脚本、CSS文件等)应该有一个唯一的、版本化的URL。例如,您可以加载/images/button_v123.png,而不是加载/images/button.png,当您更改该文件时,它的URL将更改为/images/button_v124.png。通常,这是通过在静态文件URL上重写URL来处理的,因此,例如,web服务器知道/images/button_v124.png实际上应该从web服务器的文件系统加载/images/button.png文件。可以通过附加内部版本号、使用文件内容的CRC或许多其他方式来创建版本号。
然后,您需要确保,在父页面中构造URL的任何地方,它们都引用版本化的URL。这显然需要用于构造所有text/html的动态代码,这可以通过调整用于生成页面的代码或通过影响所有URL请求的服务器范围的插件来实现。
然后,为所有资源请求(图像、脚本、Expires文件等)设置CSS头。至遥远的未来日期(例如,从现在起10年后)。这将有效地永久缓存它们。这意味着您的每个页面加载的所有请求都将始终从缓存中获取;缓存失效永远不会发生,这是正常的,因为当底层资源发生更改时,父页面将使用新的URL来查找它。
最后,你需要弄清楚你想如何缓存你的“父”页面。你如何做到这一点是一个判断的电话。您可以使用ETag/If-None-Match headers每次检查页面的新版本,如果服务器报告页面没有更改,这将非常快速地从缓存加载页面。或者,在检查服务器之前,可以使用Expires (和/或Max-Age)从缓存中重新加载父页面一段时间。
如果您想做一些更复杂的事情,您可以随时在kiosk上放置一个自定义代理服务器--在这种情况下,您可以完全、集中地控制如何进行缓存。
https://stackoverflow.com/questions/4908395
复制相似问题