Luk*_*nga 6 amazon-web-services amazon-cloudfront
是否可以将Amazon CloudFront配置为仅缓存200个代码?我希望它永远不会缓存3xx,因为我想将它连接到一个动态图像处理工具,Lambda通过S3执行307,如描述https://aws.amazon.com/blogs/compute/resize-images-在即时与-亚马逊S3-AWS-λ-和亚马逊API网关/
除非您可以配置源以相应地设置Cache-Control标头,否则无法明确告知CloudFront仅缓存2XX而不缓存3XX - CloudFront将2XX和3XX视为"成功"并将它们视为相同.(它仅对4XX和5XX有不同的规则,对条件请求的304响应有明显的例外.)
在S3重定向的情况下,问题在于S3重定向规则不允许设置Cache-Control标头.
但是,如果您正在设置Cache-Control正确的对象标题,当你在S3创建它们-因为你应该-那么你可以probably¹依靠CloudFront的的Default TTL设置完全解决问题,告诉CloudFront的是缺乏响应Cache-Control头不应该被缓存.这意味着将其设置Default TTL为0,当然也要求将Minimum TTL其设置为0,因为最小<= default是必需的.
本Maximum TTL应在其默认值留下,因为它是用来缩短了CloudFront的缓存时间与对象max-age比大Maximum TTL.您可能不希望缩短2XX响应的可缓存性.
假设浏览器行为正常并且不缓存重定向(对于307或302它们不应该这样),那么您的问题就会得到解决,因为CloudFront在此配置中的行为与预期一致 - 表示Cache-Control它何时存在,而不是缓存响应时缺席.
但是,如果您发现浏览器或其他下游缓存持有您的重定向,您可能必须更积极.
Cache-Control当原点不提供响应时,向响应显式添加(或其他标题)的唯一方法是使用Lambda @ Edge.以下代码用作OriginResponse²触发器,将为从源服务器接收的Cache-Control: no-cache, no-store, private任何3XXHTTP响应添加(是的,它有点冗余).如果Cache-Control原点的响应中存在任何标题,则它将被覆盖.任何其他响应(例如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);
};
Run Code Online (Sandbox Code Playgroud)
有了这个触发器,2XX响应没有修改其标题,但302/307响应将被修改,如图所示.这将告诉CloudFront和浏览器不要缓存响应.
¹ 可能 ......并不意味着CloudFront 可能只是做正确的事情.CloudFront的行为完全符合预期.大概是指这个是唯一需要的动作:您可以或许考虑这种解决方案足够了,因为很可能浏览器将不缓存重定向.像往常一样,浏览器行为是通配符,可能需要更积极地添加显式Cache-Control标头以防止浏览器缓存重定向.
² 地响应触发检查并可以修改他们缓存之前(如果它们被缓存),并返回给浏览器的响应某些方面.Cache-Control在流中此点修改或添加标头会阻止响应存储在CloudFront缓存中,并且还应阻止浏览器缓存.
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |