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

时间:2017-09-08 16:33:09

标签: amazon-web-services amazon-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/

2 个答案:

答案 0 :(得分:6)

没有办法明确告诉CloudFront只缓存2XX而不缓存3XX,除非您可以配置源以相应地设置Cache-Control标头 - CloudFront将2XX和3XX视为“成功”并对待他们一样。 (它仅对4XX和5XX有不同的规则,对条件请求的304响应有明显的例外。)

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

但是,如果您在S3中创建对象时正确设置Cache-Control标题 - 就像您应该的那样 - 那么您可以可能是依赖于CloudFront的{{ 1}}设置通过告诉CloudFront不应缓存缺少Default TTL标头的响应来完全解决问题。这意味着将Cache-Control设置为0,当然也要求Default TTL也设置为0,因为最小< = default是必需的。

Minimum TTL应保留其默认值,因为它用于缩短 CloudFront缓存时间,使Maximum TTL大于{{1}的对象}}。您可能不希望缩短2XX响应的可缓存性。

假设浏览器行为正常并且没有缓存重定向(对于307或302它们不应该这样),那么您的问题就会得到解决,因为CloudFront在此配置中的行为符合预期 - 尊重max-age存在,而不是在缺席时缓存响应。

但是,如果您发现浏览器或其他下游缓存持有您的重定向,则可能必须更积极。

当原点不提供响应时,向响应显式添加Maximum TTL(或其他标题)的唯一方法是使用Lambda @ Edge。以下代码用作OriginResponse²触发器,会向从源服务器接收的任何Cache-Control HTTP响应添加Cache-Control(是的,它有点多余)。如果原始响应中存在任何Cache-Control: no-cache, no-store, private标头,则会覆盖该标头。任何其他响应(例如2XX)都不会被修改。

3XX

启用此触发器后,2XX响应不会修改其标头,但302/307响应将如图所示进行修改。这将告诉CloudFront和浏览器不要缓存响应。

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

² Origin Response 触发器检查并可以在缓存之前修改响应的某些方面(如果它们被缓存)并返回给查看器。在此流程中修改或添加'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); }; 标头会阻止响应存储在CloudFront缓存中,并且还应阻止浏览器缓存。

答案 1 :(得分:0)

If you look at the CloudFront Distribution Error Pages Tab, you can configure the status code caching

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

接下来,关于CloudFront行为如果您想每次从原点检索,请确保缓存为零。

如果使用标头,请确保Origin Cache-Control Headers具有正确的缓存标头值。

enter image description here