使用不同的查询字符串缓存图像(S3签名的URL)

时间:2010-06-11 23:14:36

标签: http caching amazon-s3

我正在试图弄清楚我是否可以让浏览器使用签名网址缓存图片。

我想要的是为每个请求生成一个新的签名网址(相同的图片,但有更新的签名),但浏览器不会每次都重新下载。

因此,假设正确设置了与缓存相关的标头,并且除查询字符串外所有URL都相同,有没有办法让浏览器缓存它?

网址看起来像是:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500

我们计划将电子标签设置为md5sum,那么它至少会在那时找出相同的图像吗?

我的另一个选择是跟踪上次发布网址的时间,然后在旧网址过期之前稍微开始发布新内容,但我不想处理会话信息。

3 个答案:

答案 0 :(得分:4)

浏览器将使用整个URL进行缓存,包括请求参数。因此,如果您更改请求参数,它将有效地成为缓存中的新“密钥”,并始终下载该图像的新副本。这是广告服务领域的一种流行技术 - 您将随机数(或当前时间戳)添加到URL的末尾作为参数,以确保浏览器始终返回服务器以发出新请求。

你可以使这个工作的唯一方法是你可以使URL静态 - 即使用Apache重写规则或某种代理。

答案 1 :(得分:4)

我在S3签名网址上遇到了完全相同的问题。我想出的唯一解决方案是让URL在同一天到期。这并不理想,但至少它会在一段时间内提供缓存。

例如,4月份签署的所有网址都在5月10日设置了到期日。我在六月签署的所有网址都将于7月10日到期。这意味着签名的网址在整个月内都是相同的。

答案 2 :(得分:1)

偶然发现了这个问题并找到了解决问题的方法。以下是您需要做的事情:

  1. 存储第一个网址字符串(例如,在localStorage中);
  2. 下次收到img网址时,只检查主网址是否匹配(str1.split('?')[0] === str2.split('?')[0]
  3. 如果有,请使用第一个作为img src属性。
  4. 希望它有所帮助。