无法使CloudFront提供缓存控制标头

时间:2018-10-22 11:27:36

标签: caching amazon-s3 amazon-cloudfront

我已经对此进行了大量阅读,但是我看到的所有解决方案似乎都不适用于IIS网站-大多数似乎都建议使用服务器端解决方案,但这些解决方案都不适合我。

我正在优化我们的站点之一,而PageSpeed,YSlow和Lighthouse都抱怨我从CloudFront CDN提供的图像没有任何缓存头。 CDN从S3存储桶中提供。

例如https://static.edie.net/webimages/new_new_new.png(未指定有效期限)

出现为“有静态组件,没有过期日期”和“利用浏览器缓存以下可缓存资源”

我终生无法解决如何让CloudFront为此类图像提供缓存头的问题。

我设置了

Cache-Control: max-age=5500000 

在s3存储桶/文件本身上,如果您通过存储桶检查文件:https://devedienet.s3.amazonaws.com/webimages/new_new.png,则其中存在缓存头。

但这似乎并不影响CloudFront映像,该映像仅具有以下标头:

Age: 12153
Connection: keep-alive
Date: Mon, 22 Oct 2018 11:18:49 GMT
ETag: "940fd4d68428cf3e4f88a45aab4d7157"
Server: AmazonS3
Via: 1.1 4f95eb10423b781564e79d7c85f85795.cloudfront.net (CloudFront)
X-Amz-Cf-Id: TZAWy8U12-ohhe-dwTkCLqXHbJKI7CJqQd21I-lvq-8rloZjTew6aw==
x-amz-meta-s3b-last-modified: 20181017T105350Z
X-Cache: Hit from cloudfront

我尝试将自定义行为添加到适用于CloudFront发行版的AWS控制面板中:

webimages/*.png
Minimum TTL: 5500000

但是这似乎没有效果。

请注意,在添加上述新规则(但没有骰子)之后,我使文件夹中的所有图像无效。

我是否缺少某些东西或误解了什么要求?

2 个答案:

答案 0 :(得分:0)

由于您正在通过Cloudfront从S3提供内容,因此在将文件上传到S3时,需要在S3中的对象上添加以下标头。过期:{某个将来的日期}

奖金:您不需要为每个对象分别指定此标头。您可以在S3上一起上传一堆文件,单击“下一步”,然后在询问S3存储类的屏幕上向下滚动并添加这些标题。并且不要忘记单击“保存”!

enter image description here

答案 1 :(得分:0)

我遇到了类似的问题,所以在做了一些阅读和试验之后,我发现 Cloudfront 的对象缓存值的最小 TTL、最大 TTL、默认 TTL 没有在响应标头中明确添加缓存控制标头如果资源在服务器级别没有资源,则为资源。其次,即使资源在 S3 添加了缓存控制元数据,它也应该介于两者之间 MinTTL < s3 Cache < Max TTL。 对象缓存值指出,对于提供的值,资源将在边缘位置缓存那么长时间,并且不会在资源的响应标头中添加缓存控制。 我所做的是创建一个 Lambda 函数,并通过更新查看器响应的缓存行为设置将其添加到 Lambda 关联下。这是我的 Lambda fn。这在请求的资源中添加了 Cache-Control 标头。

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    const headers = response.headers;
    
const headerCache = 'Cache-Control';


headers[headerCache.toLowerCase()] = [{
    key: headerCache,
    value: 'max-age=1096000'
}];

callback(null, response);

};