告诉 CloudFront 只缓存 200 个响应代码

Tell CloudFront to only cache 200 response codes

是否可以将 Amazon CloudFront 配置为仅缓存 200 个代码?我希望它永远不会缓存 3xx,因为我想将它连接到使用 Lambda 的动态图像处理工具,该工具通过 S3 执行 307,如 https://aws.amazon.com/blogs/compute/resize-images-on-the-fly-with-amazon-s3-aws-lambda-and-amazon-api-gateway/

所述

您可以在您的用例中忽略响应页面路径和 HTTP 响应代码。

接下来,在 CloudFront 行为上,如果您想每次都从源中检索,请确保缓存为零。

如果您正在使用 headers,请确保 Origin Cache-Control Headers 具有正确的缓存 header 值。

没有办法明确告诉 CloudFront 仅缓存 2XX 而不是缓存 3XX,除非您可以配置源以相应地设置 Cache-Control header -- CloudFront 考虑 2XX 和 3XX as "success" 并一视同仁。 (它仅对 4XX 和 5XX 有不同的规则,对于条件请求的 304 响应是一个明显的例外。)

在 S3 重定向的情况下,问题在于 S3 重定向规则不允许设置 Cache-Control header。

但是,如果您在 S3 中创建 Cache-Control header 时在 objects 上正确设置它们——正如您应该的那样——那么您可以 可能¹ 依靠 CloudFront 的 Default TTL 设置来完全解决问题,方法是告诉 CloudFront 不应缓存缺少 Cache-Control header 的响应。这意味着将 Default TTL 设置为 0,并且当然需要将 Minimum TTL 也设置为 0,因为最小 <= 默认值是必需的。

Maximum TTL 应保留其默认值,因为它用于缩短 objects 的 CloudFront 缓存时间 [=19] =] 大于 Maximum TTL。您可能不想缩短 2XX 响应的可缓存性。

假设浏览器行为正确并且不缓存重定向(它们不应该缓存重定向,对于 307 或 302),那么您的问题就解决了,因为 CloudFront 在此配置中的行为符合预期 - 尊重 Cache-Control当它存在时,当它不存在时不缓存响应。

但是,如果您发现浏览器或其他下游缓存保留了您的重定向,您可能必须采取更积极的措施。

在源不提供响应时显式添加 Cache-Control(或其他 header)的唯一方法是使用 Lambda@Edge。以下代码用作 Origin Response² 触发器,会将 Cache-Control: no-cache, no-store, private(是的,它有点多余)添加到从源服务器接收到的任何 3XX HTTP 响应。如果源的响应中存在任何 Cache-Control header,它将被覆盖。不会修改任何其他响应(例如 2XX)。

'use strict';

// add Cache-Control: no-cache, ... only if response status code is 3XX

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if (response.status.match(/^30[27]/))
    {
        response.headers['cache-control'] = [{ 
          key:   'Cache-Control', 
          value: 'no-cache, no-store, private' 
        }];
    }

    callback(null, response);
};

有了这个触发器,2XX 响应的 header 不会被修改,但 302/307 响应将被修改,如图所示。这将告诉 CloudFront 和浏览器不要缓存响应。


¹ 可能... 并不意味着 CloudFront 只是 可能 做正确的事情。 CloudFront 的行为完全符合预期。 可能指的是这是唯一需要采取的行动:您可以可能认为这个解决方案就足够了,因为可能浏览器不会缓存重定向。与往常一样,浏览器行为是通配符,可能需要更积极地添加显式 Cache-Control header 以防止浏览器缓存重定向。

² Origin Response 触发检查并可以在缓存(如果已缓存)并返回给查看器之前修改响应的某些方面。在流程的此时修改或添加 Cache-Control header 将阻止响应存储在 CloudFront 缓存中,并且应该也会阻止浏览器缓存。