【问题标题】:Expires Header max value过期标头最大值
【发布时间】:2011-08-18 15:16:30
【问题描述】:

我在 S3 存储桶上有数百万个图像文件,我知道它们永远不会改变。 为了优化请求,我决定在我的文件中添加一个 expires 标头(如下所述:google page speed rules

将标题添加到我的所有文件的过程既漫长又昂贵,所以我不想重复它。但是,Http Rfc 建议将 Expires 标头设置为未来一年的最大到期日期:

HTTP/1.1 servers SHOULD NOT send Expires dates more than one year in the future

...这意味着我必须在一年内更新我的标题。

我的问题是:

我可以将我的标头值设置为非常远的日期(例如:01-01-2020)并违反 RFC 建议吗?这样做有什么风险?

是否有另一种解决方案可以告诉请求我的文件的客户端无限期地缓存它们,而无需更新我的亚马逊 S3 存储上的任何内容?

【问题讨论】:

  • 嗯,这是应该的。如果服务器不服从任何应该,它充其量是有条件地兼容,而不是无条件地兼容 w.r.t。 HTTP 1.1(RFC 2616,第 1.2 节)。所以技术上没问题。我不知道 S3 是如何工作的,但你不能只发送一个 $(NOW + 1 year) 的日期而不是一个固定的日期吗?
  • 如果这就是您的意思,当客户端在 S3 上发出请求时,无法动态设置标头。所有标头都有“静态”值,并且更新它们需要为每个(实际上是 CopyObjectRequest)提出一个亚马逊 PUT 请求,当您的存储桶中已经存储了数百万个文件时,这很痛苦。

标签: amazon-s3 http-headers


【解决方案1】:

您还可以设置更现代的标题:

Cache-Control: max-age=31536000, public

每个用户代理在加载每张图片后,都愿意在请求新副本之前将其缓存一整年。 (大整数是 365 × 24 × 60 × 60 秒。)如果仍然有浏览器不理解 Cache-Control,它们可能会在图像的生命周期内逐渐消失!

【讨论】:

    【解决方案2】:

    您可以将标头值设置为 2038 年 1 月 19 日左右的最大值(最大 32 位时间戳)。 一段时间以来,这就是 Google 在跟踪 cookie 到期时所做的事情。

    这样做的唯一风险是,如果有一天,出于某种原因,您决定更改一张图片(或注意到一张或多张图片有问题),您的客户将不会下载新版本。您决定是否值得冒险。

    除此之外,我真的没有看到任何潜在的问题。

    【讨论】:

    • 如果您将文件命名为其内容的 MD5 哈希值,则可以消除文件被更改的风险。然后,如果文件发生更改,文件名将不同,并且浏览器缓存将不会应用,因为该文件名从未被缓存。
    • 是的,实际上我就是这么做的(使用 md5 散列进行命名)
    • 我很好奇 MD5 方法及其好处。似乎它的最大缺点是识别哪个图像是哪个(除非您远程管理所有这些)。它有什么优势,例如,将文件命名为“myfile.[timestamp].png”?
    • 另一种选择是附加一个被 S3 忽略的 GET 参数。任何时候您想确保人们看到的是最新版本,只需增加版本号即可。浏览器会将其视为不同的文件。例如。 myimage.png?v=2、myimage.png?v=3 等
    猜你喜欢
    • 2010-10-15
    • 2014-05-20
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多