我有一个网页,其资源位于不断变化的地址。例如,网页可能位于http://www.mysite.com/?page = page1,它可能包含图像http://www.mysite.com/?img = image999。虽然这两个资源都在我的网站上,但我无法控制特定页面上特定图像的位置。
我在页面和图片上设置了长缓存的标题。但是,如果用户代理仅缓存网页而不缓存图像(或者例如,用户清除缓存并且图像从缓存中清除),则用户代理将从缓存中检索页面并请求/?img = image999。但是,此时,图像不再位于/?image = image999,而是位于/?image = image998。因此,图像不会显示给用户。
这个问题的解决方案是什么?以下是我能想到的: -
我的确切问题不是处理图像,而是处理HTML5视频。具体来说,在谷歌浏览器上我注意到,即使我在缓存上设置了1年的到期日期,视频似乎也经常从缓存中删除。但是,无论Chrome的缓存策略如何,我仍然对一般资源的解决方案感兴趣。
编辑:要确认,我在网页和图片上使用“不重新验证”+“1年后到期”缓存。因此,如果UA请求网页(page1)+ image(image999)一次,它将不会在后续请求中命中服务器,一切都很好。当图像从UA缓存中删除但网页仍然存在时,会发生此问题。在这种情况下,UA将不请求网页的服务器,但将请求服务器获取图像(image999)。但是,在此期间,图像已更改URL(image999 - > image998),服务器将返回404.结果是UA将不显示图像。我该如何防止这种情况?
答案 0 :(得分:0)
正如问题所述,如果我限制自己使用Expires标题,这些是我能想到的解决方案: -
禁用网页和图片的缓存。
仅启用图像缓存。网页的每个请求都将由服务器处理,但缓存图像的请求不会到达服务器。
启用网页和图片的缓存。对于过时图像的请求,请发送“301 Moved Permanently”响应和新图像的位置,并祈祷UA对其进行缓存。 (我的测试表明Google Chrome不会缓存301请求或重定向到的内容,而不管Cache标头如何)
对于我的问题,我已经放弃使用Expires Header,而是使用ETag来处理网页和图像。这样我就不必处理过时图像的请求了。