Cloudfront 缺少缓存控制

Cloudfront missing cache control

将我的所有文件上传到 AWS S3 存储桶后,我发现缓存控制 header 丢失了。我以这种方式设置了我的云端分发:

之后我把我所有的文件作废,等到它完成。但是我没有得到任何 Cache-Control header:

HTTP/1.1 200 OK
x-amz-id-2: fnvFKqf8aeykSWBnQAPlj6FE7JvZSPXHdyOosjce6PyMTr7FXQsSaUflKlJuMv+RBmvaErjsLUY=
x-amz-request-id: 890141931E821C87
Date: Tue, 09 Mar 2021 16:27:03 GMT
Last-Modified: Tue, 09 Mar 2021 16:25:04 GMT
ETag: "444ec6f04c020fe4dbd43b17e1c9baba"
Cache-Control: max-age=15552000
x-amz-version-id: q8R8DSCtnLai4D70p1csuwXiEZXaFQtv
Accept-Ranges: bytes
Content-Type: image/jpeg
Content-Length: 206070
Server: AmazonS3

如果您希望在 CloudFront 的响应 Headers 中 'cache-control' header,则必须为存储在 S3 存储桶中的每个 object 指定此元数据,因为CloudFront 没有 return 这个 header 具体。

要使用 AWS 控制台批量编辑所有现有文件的元数据,您可以按照以下给定的步骤操作:

  1. 登录 AWS 管理控制台
  2. 进入 S3 存储桶
  3. Select 单击“名称”附近的复选框的所有文件
  4. 单击“操作”,然后单击 select“编辑元数据”
  5. “添加元数据”--> 将类型指定为系统定义,将键指定为 Cache-Control,将值指定为 max-age=31536000
  6. 按“编辑元数据”按钮

要从 AWS CLI 添加元数据,请运行下面给出的命令:

aws s3 cp s3://bucket-name/ s3://bucket-name/ --cache-control max-age=31536000 --recursive

默认情况下,S3 不会将 cache-control header 添加到所有上传到 S3 存储桶的 object,但是在上传文件时,您可以指定元数据添加 cache-control header。您可以 运行 下面给出的 AWS CLI 命令相同:

aws s3 cp object-name s3://bucket-name/object-name --cache-control max-age=31536000

如果您还想添加一些其他 user-defined 元数据,那么您可以 运行 下面给出的命令:

aws s3 cp object-name s3://bucket-name/object-name --cache-control max-age=31536000 --metadata="test=1,example=2"

@retroriff 的响应有效,但如果您在部署期间有一些 CI/CD,则需要将其添加到那里。因此,我解决此问题的另一种方法是在分发行为中对响应 header 使用 CloudFront 函数。

这里是 cache-control 函数的一些例子: https://docs.aws.amazon.com/pt_br/AmazonCloudFront/latest/DeveloperGuide/example-function-add-cache-control-header.html