【发布时间】:2010-12-17 00:04:25
【问题描述】:
我有一个网页,其中的资源地址不断变化。例如,网页可能位于 http_://www.mysite.com/?page=page1,它可能包含图像 http_://www.mysite.com/?img=image999。虽然这两种资源都在我的网站上,但我不控制特定图像在特定页面上的位置。
我为页面和图像上的长缓存设置了标题。但是如果用户代理只缓存网页而不是图像(或者例如,用户清除缓存并且图像从缓存中清除),用户代理将从缓存中检索页面并请求 /?img=image999。但是,此时,图像不再位于 /?image=image999,而是位于 /?image=image998。因此图像不会显示给用户。
解决这个问题的方法是什么?以下是我能想到的:-
- 禁用网页和图像的缓存。最糟糕的解决方案。
- 仅禁用网页缓存。更好的解决方案。
- 请记住,在服务器端,image998 曾经位于 image999,如果请求 /?image=image999,请将其重定向/传输到 /?image=image998。最好的解决方案,但实施起来很痛苦。编辑:事实上,我现在意识到在我的情况下这是不可能的 sadface
我的确切问题不是处理图像,而是处理 HTML5 视频。具体来说,在谷歌浏览器上,我注意到视频似乎经常从缓存中删除,即使我在缓存上设置了 1 年的到期日期。但不管 Chrome 的缓存策略如何,我仍然对通用资源的解决方案感兴趣。
编辑:为了确认,我在网页和图像上都使用“不重新验证”+“1 年内到期”缓存。因此,如果 UA 请求网页(page1)+图像(image999)一次,它不会访问服务器进行后续请求,一切都很好。当图像从 UA 缓存中退出但网页仍然存在时,就会出现问题。在这种情况下,UA 将不向服务器请求网页,但将向服务器请求图像 (image999)。但是,与此同时,图片的 URL 发生了变化(image999 -> image998),服务器将返回 404。结果是 UA 不会显示该图片。如何防止这种情况发生?
【问题讨论】:
-
包含指向 img999 链接的 html 页面应该更改,并且浏览器应该请求新页面而不是使用缓存版本,因为它不会获得未修改的 HTTP 标头。我不明白这个问题。在问题的最后你说问题是它没有被缓存,这不是你在问题开始时所说的(有一个过时资源的链接)
-
很抱歉给您带来了困惑。正在缓存的是网页,而不是图像。我都需要缓存。
-
另外,我不希望在图像 URL 更改时重新下载网页的原因是图像仍然相同,只是在不同的 URL。正如我所说,真正的问题不是图像,而是 HTML5 视频,不断变化的 URL 是防止热链接的措施。但是如果客户已经请求了网页+视频,我不在乎他们是否永久缓存它。
-
最后,这是一个完整的缓存,而不是重新验证缓存。不涉及电子标签和 304 标头。 UA 不会使用服务器验证网页,而是使用缓存中的网页。