如何正确禁用 API 请求的 CloudFront 缓存

JHH*_*JHH 8 caching cache-control amazon-cloudfront aws-api-gateway

我已将 AWS CloudFront 设置为从同一域提供静态内容API 服务器。这意味着我有两种行为,一种为 API 网关/api提供服务,另一种为所有其他路径提供来自 S3 的内容。

问题是我不希望 CF 从 API 服务器缓存任何东西。我很惊讶地发现似乎没有一个“主设置”来完全禁用缓存行为;相反,文档指的是Cache-control: no-cache在原点上使用在 CF 行为中打开“基于所有标头的缓存”。

但是,这些解决方案中没有一个完全满足我的要求,即不缓存传递所有标头。如果我添加Cache-control: no-cache到我的起源,CF似乎尊重这一点,但仍然存在CF设置的问题。CF 有一个设置“基于标题的缓存:全部/无/白名单”。文档说要禁用缓存,应该使用“全部”,这是有道理的(尽管与实际设置相比有点模糊:禁用缓存:开/关)。但是,一旦我将此设置设置为“全部”,整个行为就会被禁用,我的 API 请求根本不会到达 API 网关,但默认为用于非 API 请求的 S3 行为。我找不到对此的任何解释,就像整个行为失败或在没有解释的情况下被禁用。

另一个问题是“基于缓存”中不存在的标头不仅会从缓存中排除(无论如何我都不想要),而且还会在转发之前从请求中删除。这对于缓存按预期工作可能是有意义的,但是由于我不想要任何缓存,因此必须确保将我使用过的所有标头列入白名单是非常令人沮丧的。依靠“全部”比必须确保白名单始终是最新的感觉要好得多。

所以:

1) 是否有更好、更清晰的方法来完全禁用 CloudFront 分配的一个路径的缓存?理想情况下,它甚至不应该依赖于设置某些标头的源,它应该完全禁用在配置的路径中缓存请求的任何尝试。

2) 为什么当我在“Cache based on headers”框中选择“All”时,我的整个 API 网关目标都被禁用了?这里发生了什么事?

小智 6

刚刚遇到了同样的问题,最终联系了 AWS 帮助人员解决这个问题。

根据AWS同事的说法,“Cache based on headers = All”在API网关上不起作用的原因是,“Host”标头的转发使其不适用。

它对我们有用的方法是将 API 网关行为的 TTL 设置为零(对于最大值和最小值)。

  • 现在,CloudFront 的 AWS 管理控制台不再直接显示 TTL。相反,您需要将缓存策略设置为“Managed-CachingDisabled” (6认同)