CloudFront“age”标头对“cache-control: private; max-age=3600”的影响

Posted

技术标签:

【中文标题】CloudFront“age”标头对“cache-control: private; max-age=3600”的影响【英文标题】:CloudFront "age" header effect on "cache-control: private; max-age=3600" 【发布时间】:2020-08-11 18:33:42 【问题描述】:

我正在为特定静态资源使用具有固定缓存时间(例如 1 天)的 CloudFront。 同时,我希望浏览器只缓存一小时,这就是为什么响应是:

cache-control: private; max-age=3600

但是,CloudFront 总是添加响应标头:

age: 35

这是在代理(本例中为 CloudFront)上缓存的秒数。

阅读https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching 真的很有意义,并且没有提到age 标头。 有可能的是,标头的值为 24678 秒,资源将被视为过期。

我只是想确认age 标头对本地浏览器缓存没有影响。我说的对吗?

【问题讨论】:

【参考方案1】:

不幸的是,经过几个小时的测试和实验,似乎无法实现我想要的 - 在 CloudFront 中缓存一个资源很长一段时间(比如 1 天),但在浏览器中缓存 30 分钟。

age 标头会影响 HTTP 资源的到期。

例如如果您有 cache-control: private; max-age=3600 并且您尝试使用 age: 4000 从 CloudFront 获取资源,则该资源已被浏览器视为已过期,下次必须重新下载。

编辑:2021 年 10 月

好消息,今年 AWS 引入了 Cloudfront 函数,这正是我们在这种情况下所需要的 - 修改发送给查看器的响应标头。

我修改的两个标题是“日期”并删除“年龄”和“到期”标题。似乎将“日期”标题设置为当前日期和时间后,不再添加“年龄”标题(但我明确删除它):

function handler(event) 
    var response = event.response;
    var headers = response.headers;

    // Set current date
    headers['date'] = value: (new Date()).toUTCString();
    delete headers['expires'];
    delete headers['age'];

    return response;

【讨论】:

您确定不是在寻找s-max-age?这将让您告诉 CloudFront 将资源在边缘缓存 1 天,但 max-age=3600 将告诉 浏览器 仅将其缓存一小时。如果浏览器在第 2 小时发出请求,它将向 CloudFront 发出新请求,但 CloudFront 不会向源发出请求。 Age 标题在这里并不重要。 @brett_f 我明白你的意思了,我现在来测试一下。但在我看来,效果似乎与在 CloudFront 上手动设置缓存时间相同——age 标头仍将包含超过 3600 并且浏览器不会在本地缓存它。

以上是关于CloudFront“age”标头对“cache-control: private; max-age=3600”的影响的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk / S3 / CloudFront Cache-Control 标头

S3/CloudFront,使用标题“Cache-Control: max-age=365000000, immutable”提供所有文件

将 Cloudfront 设置为从不重新获取资产

Cloudfront 不清除缓存

CloudFront 缓存持续时间和最小 TTL

防止 Amazon Cloudfront 盗链