CloudFront 对象的正确失效路径

Correct invalidation path for CloudFront object

我正在尝试找出使对象在 CloudFront 分发上失效的正确路径。

CloudFront 配置了备用域名 *.example.com

棘手的部分是我在 EC2 上设置了一个自定义源,它使用 HAProxy 进行一些路径重写。

所以请求到

mysubdomain.example.com/icon.png

重写为

s3.amazonaws.com/examplebucket/somedirectory/mysubdomain/icon.png

然后将结果返回到 CloudFront。 (因此,Path 和 Host 都被重写了)

现在,我在发送失效请求时无法确定此对象的正确路径。 (我不想使用版本控制,因为我需要文件名保持不变)

我试过以下配置,但它似乎不起作用。已创建并处理失效,但没有任何效果。

const invalidationParams = {
  DistributionId: 'MY_DISTRIBUTION_ID',
  InvalidationBatch: {
    CallerReference: 'SOME_RANDOM_STRING',
    Paths: {
      Quantity: 1,
      Items: [
        '/somedirectory/mysubdomain/icon.png'
      ]
    }
  }
}

由于只指定了PATH,相对于分布,在失效配置中没有办法指定完整的URL,是不是导致这个配置中的对象无法失效?

CloudFront 失效考虑 every object 与浏览器请求的路径规范匹配。要使 http://example.com/cat.jpg 无效,您指定以下之一:

cat.jpg
/cat.jpg

前导斜杠是可选的,但如果没有则隐含。

路径是无效请求唯一接受的值。

对于每个边缘位置,与该路径匹配的 object 的每个副本——无论备用域名或与之关联的其他属性如何——都将被驱逐。

请注意,"every copy of an object matching that path" 可能会让某些人感到困惑,因为假设可能只有一个副本与给定路径匹配,但这是不正确的。 CloudFront 缓存 "same" object 的不同副本,具体取决于转发到源的请求参数。如果查询字符串、cookie、白名单 headers 等被转发,那么 "same" object 的许多副本将被缓存,因为缓存要求缓存假定响应将如果转发的请求参数不同,则不同。这就是为什么默认情况下很少转发的原因——它有助于您的命中率,因为它降低了任何给定请求看起来 "unique" 到缓存逻辑的可能性。