AWS CloudFront:缓存特定对象
AWS CloudFront: cache specific objects
我有一个具有以下配置的 CDN (CloudFront) 分发。 (我使用签名的 cookie,但我认为它不相关):
DefaultCacheBehavior:
# Target the origin
TargetOriginId: !Sub 'S3-${ProjectName}-${Environment}'
ViewerProtocolPolicy: redirect-to-https
# Check always the origin (in this case S3) for the item so always the newest item is served.
MinTTL: 0
DefaultTTL: 0
MaxTTL: 0
AllowedMethods:
- HEAD
- GET
- OPTIONS
CachedMethods:
- HEAD
- GET
- OPTIONS
ForwardedValues:
QueryString: true
Cookies:
Forward: all
# Specifies the AWS account(s) that you want to allow to create signed URLs or signed cookies for private content.
TrustedSigners:
- !Ref AccountID
现在我有一些带有元数据的对象(对象 A):
缓存控制:无缓存
我还有其他一些带有元数据的对象(对象 B):
缓存控制:最大年龄=604800
现在我访问对象A:
first access: X-Cache: Miss from cloudfront
second access: X-Cache: RefreshHit from cloudfront
现在我访问对象 B:
first access: X-Cache: Miss from cloudfront
second access: X-Cache: RefreshHit from cloudfront
我怀疑对象 B 显示:从 CloudFront 命中?
我做错了什么?
您的 MaxTTL: 0
意味着来自 CloudFront 的每个请求都总是 代理到源。你应该增加这个值。
您为默认 TTL 指定的值仅在您的源不添加 HTTP headers 时适用,例如 Cache-Control max-age、Cache-Control s-maxage , 或过期至 objects.
中查看更多内容
AWS 有一个很好的文档:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
来自 cloudfront 的 RefreshHit :这意味着 CloudFront 仍在缓存,但它正在使用 origin 进行条件 GET 以了解对象是否已被修改,如果它收到 304 未修改,它将从它的缓存中提供它,否则从 origin会 return 一个新对象(如果对象已被修改)。
如果您查看上面 link 中提到的 table ,您就会明白为什么您会从云端看到对象 B 的 RefreshHit。Cache-control 和 CloudFront TTL 具有相关性.
我有一个具有以下配置的 CDN (CloudFront) 分发。 (我使用签名的 cookie,但我认为它不相关):
DefaultCacheBehavior:
# Target the origin
TargetOriginId: !Sub 'S3-${ProjectName}-${Environment}'
ViewerProtocolPolicy: redirect-to-https
# Check always the origin (in this case S3) for the item so always the newest item is served.
MinTTL: 0
DefaultTTL: 0
MaxTTL: 0
AllowedMethods:
- HEAD
- GET
- OPTIONS
CachedMethods:
- HEAD
- GET
- OPTIONS
ForwardedValues:
QueryString: true
Cookies:
Forward: all
# Specifies the AWS account(s) that you want to allow to create signed URLs or signed cookies for private content.
TrustedSigners:
- !Ref AccountID
现在我有一些带有元数据的对象(对象 A): 缓存控制:无缓存
我还有其他一些带有元数据的对象(对象 B): 缓存控制:最大年龄=604800
现在我访问对象A:
first access: X-Cache: Miss from cloudfront
second access: X-Cache: RefreshHit from cloudfront
现在我访问对象 B:
first access: X-Cache: Miss from cloudfront
second access: X-Cache: RefreshHit from cloudfront
我怀疑对象 B 显示:从 CloudFront 命中?
我做错了什么?
您的 MaxTTL: 0
意味着来自 CloudFront 的每个请求都总是 代理到源。你应该增加这个值。
您为默认 TTL 指定的值仅在您的源不添加 HTTP headers 时适用,例如 Cache-Control max-age、Cache-Control s-maxage , 或过期至 objects.
中查看更多内容AWS 有一个很好的文档:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html
来自 cloudfront 的 RefreshHit :这意味着 CloudFront 仍在缓存,但它正在使用 origin 进行条件 GET 以了解对象是否已被修改,如果它收到 304 未修改,它将从它的缓存中提供它,否则从 origin会 return 一个新对象(如果对象已被修改)。
如果您查看上面 link 中提到的 table ,您就会明白为什么您会从云端看到对象 B 的 RefreshHit。Cache-control 和 CloudFront TTL 具有相关性.