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

时间:2018-10-08 14:47:39

标签: caching aws-api-gateway amazon-cloudfront cache-control

我将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)为什么在“基于标题的缓存”框中选择“全部”时,为什么禁用了整个API网关目标?这是怎么回事?

1 个答案:

答案 0 :(得分:0)

遇到同样的问题,最终就此与AWS帮助联系。

基于AWS关联,“基于标头的缓存=全部”缓存在API网关上不起作用的原因是,“主机”标头的转发使其不适用。

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