【问题标题】:Caching images with different query strings (S3 signed urls)缓存具有不同查询字符串的图像(S3 签名的 url)
【发布时间】:2010-06-11 23:14:35
【问题描述】:

我正在尝试弄清楚是否可以让浏览器缓存带有签名网址的图像。

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

那么,假设缓存相关的标头设置正确,并且除了查询字符串之外的所有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

我们计划将 e-tags 设置为 md5sum,那么它至少会在那时发现它是同一个图像吗?

我的另一种选择是跟踪上次提供网址的时间,然后在旧网址过期之前开始提供新网址,但我不想处理会话信息。

【问题讨论】:

    标签: http caching amazon-s3


    【解决方案1】:

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

    你可以让它工作的唯一方法是如果你可以使 URL 静态 - 即通过使用 Apache 重写规则或某种代理。

    【讨论】:

    • 你知道它是否至少会检查电子标签而不再次下载吗?
    • 只有当浏览器在缓存中找到文件时(并且如果原始文件具有 ETag 值),浏览器才会将 ETag 标头发送到服务器。因此,如果它无法在其缓存中找到它(如果 URL 已更改,则不会),则没有 ETag 值可在请求中发送。
    • URL 重写规则会再次使 S3 签名失效,因为 Web 服务器会自动提供未过期的链接。然后您还可以将 S3 中的文件标记为“公共”。 (然后,访问文件不需要签名)
    【解决方案2】:

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

    例如,我在 4 月期间签署的所有 URL 都设置为 5 月 10 日到期。我在 6 月签署的所有 URL 都将在 7 月 10 日到期。这意味着签名的 URL 在整个月内都是相同的。

    【讨论】:

      【解决方案3】:

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

      1. 存储第一个url字符串(以localStorage为例);
      2. 下次收到 img url 时,只需检查它们的主 url 是否匹配 (str1.split('?')[0] === str2.split('?')[0])
      3. 如果有,请使用第一个作为 img src 属性。

      希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-05
        • 2013-11-04
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        相关资源
        最近更新 更多