如何在Amazon CloudFront中设置缓存控制头?

25
我有一个 Amazon CloudFront 分发,它创建了一个“源”到我的 CDN。在我的行为中,我设置了最大 TTL、最小 TTL 和默认 TTL。但我的响应标头在被重定向的静态文件中没有返回 Cache-Control 标头。如何设置缓存控制?我需要这个来用于 Google 页面洞察。 文件以创建缓存控制 我的标头响应

你能找到解决方案吗? - Dodo
4个回答

39

您可以在CloudFront实例中添加Cache-Control头,而无需使用功能。

  • 进入AWS控制台并导航至CloudFront实例
  • 转到策略->响应标头并单击“在自定义策略下创建响应标头策略”。如果您有现有策略,请编辑它。
  • 在下一个屏幕中,在自定义标题下添加Cache-Control头以及您想要的最大年龄值。如果您想要覆盖来源,则可以将此值设置为覆盖源。
  • 现在,进入您的Distribution并导航到Behaviours选项卡。
  • 在默认行为下,选择刚刚创建的响应标头策略。

输入图像描述

现在您的所有响应都将包含您设置的缓存标头。


4
请注意,这是最近的一个功能,仅在2021年11月发布。它完全解决了原始问题,现在绝对是最佳解决方案! - ThirstyMonkey
7
对于使用S3作为源的CloudFront分配,想要将缓存控制值(针对现有和未来的文件)设置为特定值的人肯定会想要启用“Origin override”选项。因为据我所知,没有办法为S3存储桶设置默认的缓存控制值。(您只能为单个文件设置它;如果未设置覆盖,则新文件或没有自定义值设置的文件将使用不可更改的默认值604800)。 - Fabien Snauwaert
添加缓存控制到请求中怎么样? - albanx

20

缓存控制

您可以在不使用函数的情况下为CloudFront实例添加缓存控制头。 https://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html

  1. 进入 AWS 控制台并导航到 CloudFront 实例。
  2. 转到“行为”选项卡
  3. 选择默认行为,并选择编辑选项以编辑该行为
  4. 在那里,您可以看到“响应标头策略 - 可选”的选项
  5. 您可以利用现有的响应标头策略或创建新的策略
  6. 转到“策略 - 响应标头”,然后在自定义策略下单击“创建响应标头策略”。如果您已经有一个现有策略,请进行编辑。
  7. 在我的情况下,我已经有一个策略,所以我选择编辑该策略
  8. 转到“自定义标头 - 可选”
  9. 添加 Cache-Control 标头以及您想要的最大年龄值。如果需要,可以设置该值以覆盖源。

自定义标头 UI 参考

  1. 在默认行为下,在“响应标头策略”下选择您刚创建或编辑的策略。

在此输入图片描述

该段内容为HTML代码,无法进行翻译,建议您提供需要翻译的文字内容。

7
正如James所提到的,CF设置中的MAX TTL、MIN TTL等定义了CloudFront分发和源端的缓存行为,也就是说,在检查源端之前CloudFront应该在Edge Locations中保留资产的时间长短。
例如,如果您有一个S3存储桶作为源端,然后有一个CloudFront分发,通过设置MAX TTL、Min TTL等,您可以告诉CloudFront它应该多久检查更改(在这种情况下是S3)。
您可以在AWS文档中了解更多信息:管理边缘缓存中内容保留时间的方式(过期)
在上面的示例中,您可以进入S3存储桶并设置Cache-Control。有关如何执行此操作的更多信息,请阅读此处

1
通过您的第二个链接中的指示在S3存储桶上设置Cache-Control是正确的解决方案。您无法在CloudFront的源上设置Cache-Control;目前CloudFront不允许这样做。OP(以及我)只是想通过设置存储桶项目的Cache-Control来通过Lighthouse测试,这是唯一的方法。 - Gregory Ledray
S3接口设置标头不太方便,如果您替换文件,则需要重新设置标头。如果您的静态文件是通过脚本自动生成的,那么这可能对您来说没问题,但在我们的情况下,我们设置了一个Lambda函数,为某些静态资产文件返回缓存控制标头以供浏览器使用。 - gaurav5430

6
你可以: 1. 配置源以在响应中添加Cache-Control头文件。 或者 2. 使用Lambda@edge (Viewer response,因为你只想将其用于Google页面洞察) 在响应中添加Cache-control头文件。 示例: https://github.com/jkrnak/serverless-lambda-at-edge/blob/master/handler.js 定义TTL不会添加任何Cache-Control头信息,它主要被用来考虑需要缓存多长时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接