【问题标题】:Prevent partial-caching of web resources防止 Web 资源的部分缓存
【发布时间】:2010-12-17 00:04:25
【问题描述】:

我有一个网页,其中的资源地址不断变化。例如,网页可能位于 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

我的确切问题不是处理图像,而是处理 HTML5 视频。具体来说,在谷歌浏览器上,我注意到视频似乎经常从缓存中删除,即使我在缓存上设置了 1 年的到期日期。但不管 Chrome 的缓存策略如何,我仍然对通用资源的解决方案感兴趣。

编辑:为了确认,我在网页和图像上都使用“不重新验证”+“1 年内到期”缓存。因此,如果 UA 请求网页(page1)+图像(image999)一次,它不会访问服务器进行后续请求,一切都很好。当图像从 UA 缓存中退出但网页仍然存在时,就会出现问题。在这种情况下,UA 将向服务器请求网页,但向服务器请求图像 (image999)。但是,与此同时,图片的 URL 发生了变化(image999 -> image998),服务器将返回 404。结果是 UA 不会显示该图片。如何防止这种情况发生?

【问题讨论】:

  • 包含指向 img999 链接的 html 页面应该更改,并且浏览器应该请求新页面而不是使用缓存版本,因为它不会获得未修改的 HTTP 标头。我不明白这个问题。在问题的最后你说问题是它没有被缓存,这不是你在问题开始时所说的(有一个过时资源的链接)
  • 很抱歉给您带来了困惑。正在缓存的是网页,而不是图像。我都需要缓存。
  • 另外,我不希望在图像 URL 更改时重新下载网页的原因是图像仍然相同,只是在不同的 URL。正如我所说,真正的问题不是图像,而是 HTML5 视频,不断变化的 URL 是防止热链接的措施。但是如果客户已经请求了网页+视频,我不在乎他们是否永久缓存它。
  • 最后,这是一个完整的缓存,而不是重新验证缓存。不涉及电子标签和 304 标头。 UA 不会使用服务器验证网页,而是使用缓存中的网页。

标签: caching resources partial


【解决方案1】:

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

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

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

  3. 为网页和图像启用缓存。对于对过期图像的请求,发送一个“301 Moved Permanently”响应,其中包含新图像的位置,并祈祷 UA 缓存它。 (我的测试表明谷歌浏览器不会缓存 301 请求或它被重定向到的内容,无论 Cache 标头如何)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多