防止部分缓存Web资源

时间:2010-12-17 00:04:25

标签: caching resources partial

我有一个网页,其资源位于不断变化的地址。例如,网页可能位于http://www.mysite.com/?page = page1,它可能包含图像http://www.mysite.com/?img = image999。虽然这两个资源都在我的网站上,但我无法控制特定页面上特定图像的位置。

我在页面和图片上设置了长缓存的标题。但是,如果用户代理仅缓存网页而不缓存图像(或者例如,用户清除缓存并且图像从缓存中清除),则用户代理将从缓存中检索页面并请求/?img = image999。但是,此时,图像不再位于/?image = image999,而是位于/?image = image998。因此,图像不会显示给用户。

这个问题的解决方案是什么?以下是我能想到的: -

  1. 禁用网页和图片的缓存。最糟糕的解决方案。
  2. 仅禁用网页缓存。更好的解决方案。
  3. 请记住,在服务器端,image998曾经是image999,如果请求是/?image = image999,请将其重定向/转移到/?image = image998。最佳解决方案,但实施起来很痛苦。编辑:事实上,我现在意识到在我的情况下这是不可能的 sadface
  4. 我的确切问题不是处理图像,而是处理HTML5视频。具体来说,在谷歌浏览器上我注意到,即使我在缓存上设置了1年的到期日期,视频似乎也经常从缓存中删除。但是,无论Chrome的缓存策略如何,我仍然对一般资源的解决方案感兴趣。

    编辑:要确认,我在网页和图片上使用“不重新验证”+“1年后到期”缓存。因此,如果UA请求网页(page1)+ image(image999)一次,它将不会在后续请求中命中服务器,一切都很好。当图像从UA缓存中删除但网页仍然存在时,会发生此问题。在这种情况下,UA将请求网页的服务器,但请求服务器获取图像(image999)。但是,在此期间,图像已更改URL(image999 - > image998),服务器将返回404.结果是UA将不显示图像。我该如何防止这种情况?

1 个答案:

答案 0 :(得分:0)

正如问题所述,如果我限制自己使用Expires标题,这些是我能想到的解决方案: -

  1. 禁用网页和图片的缓存。

  2. 仅启用图像缓存。网页的每个请求都将由服务器处理,但缓存图像的请求不会到达服务器。

  3. 启用网页和图片的缓存。对于过时图像的请求,请发送“301 Moved Permanently”响应和新图像的位置,并祈祷UA对其进行缓存。 (我的测试表明Google Chrome不会缓存301请求或重定向到的内容,而不管Cache标头如何)

  4. 对于我的问题,我已经放弃使用Expires Header,而是使用ETag来处理网页和图像。这样我就不必处理过时图像的请求了。