告诉 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 缓存中,并且应该也会阻止浏览器缓存。
是否可以将 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 缓存中,并且应该也会阻止浏览器缓存。