使用 HTML img 标签时,Cloudfront 连续未命中缓存,但通过 Postman/browser 请求获得缓存命中

Continuous cache-misses from Cloudfront when using HTML img tag, but getting cache-hits with Postman/browser requests

我有一个带有 S3 源存储桶(使用 Cloudformation/SAM 委托资源)的 Cloudfront 分布,它的行为很奇怪。 S3 bucket只存储图片。

每当我通过 src 属性请求图像时,开发工具中的网络选项卡显示 Cloudfront 资源是缓存未命中(即使在反复刷新后仍然存在)。但是,当通过 Postman 或浏览器发送 GET 请求时,刷新一次后我开始看到来自相应请求发件人的缓存命中。

客户端,我使用带有样式组件的 React 作为图像标签。没有附加查询字符串,Cloudfront 也被告知忽略它们。

不确定这是我的 Cloudformation 设置问题还是服务器缓存响应的问题,但非常感谢任何指导!

我的 template.yaml 文件:

UserAssetsDistributionIdentity:
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    Properties:
      CloudFrontOriginAccessIdentityConfig: 
        Comment: 'Origin identity.'
  UserAssetsDistribution: 
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins: 
          - DomainName: // Domain name removed
            Id: user-assets-bucket
            S3OriginConfig: 
              OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/${UserAssetsDistributionIdentity}'
        Enabled: 'true'
        Comment: Projects microservice to distribute user uploaded assets
        DefaultCacheBehavior: 
          AllowedMethods:
            - GET
            - HEAD
          CachedMethods: 
            - GET
            - HEAD
          CachePolicyId: b2884449-e4de-46a7-ac36-70bc7f1ddd6d
          TargetOriginId: user-assets-bucket
          ViewerProtocolPolicy: allow-all
        ViewerCertificate:
          AcmCertificateArn: // arn removed
          SslSupportMethod: sni-only
          MinimumProtocolVersion: TLSv1
        Aliases: 
          - uploads.phazia.com
  UserAssetsBucket:
    Type: AWS::S3::Bucket
    Properties: 
      AccessControl: PublicRead

问题是 Chrome 将 repeat-requests 的响应 header 缓存到资源。

Devtools 显示所请求资源的状态代码 200 以及一条(来自磁盘缓存的)消息 - 让我相信状态代码和响应 header 正在被缓存。尝试清除浏览器缓存并获得预期的 Cloudfront header.