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”提供所有文件