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

How to properly disable CloudFront caching for API requests

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

问题是我不希望 CF 从 API 服务器缓存任何内容。我很惊讶地发现似乎没有 "master setting" 来完全禁用缓存行为;相反,文档指的是在原点 上使用 Cache-control: no-cache 在 CF 行为中打开 "Cache based on all headers"。

然而,none 这些解决方案完全满足我的要求,即不缓存 通过所有 headers。如果我将 Cache-control: no-cache 添加到我的来源,CF 似乎尊重这一点,但仍然存在 CF 设置的问题。 CF 有一个设置 "Cache based on headers: All/None/Whitelist"。文档说要禁用缓存,应该使用 "All",这是有道理的(尽管与实际设置相比有点模糊:禁用缓存:on/off)。但是,一旦我将此设置设置为 "All",整个行为就会被禁用,我的 API 请求根本不会到达 API 网关,而是默认为用于non-API 个请求。我找不到任何解释,就像整个行为失败或在没有解释的情况下被禁用。

另一个问题是 "Cache based on" 中不存在的 headers 不仅会被排除在缓存之外(无论如何我都不想要),而且 会被剥离 在转发请求之前退出请求。这对于缓存按预期工作可能是有意义的,但由于我不想要任何缓存,因此必须确保 white-list 我曾经使用过的所有 headers 是非常令人沮丧的。依赖 "All" 比必须确保 white-list 始终是最新的要好得多。

所以:

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

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

刚遇到同样的问题,最后联系了 AWS 帮助。

根据 AWS 伙伴,"Cache based on headers = All" 无法在 API 网关上工作的原因是 "Host" header 的转发使其 non-applicable.

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