【问题标题】:How to get past CloudFront cached redirect and hit API Gateway instead?如何通过 CloudFront 缓存重定向并改为访问 API 网关?
【发布时间】:2019-09-29 10:01:50
【问题描述】:

我设置了 CloudFront 分配,以便 <domain>/api 将我重定向到 <api-gateway-url>/<env>/api。但是我发现有时 CloudFront 会缓存对 GET 请求的响应,并且浏览器不会重定向到 API Gateway 端点并返回缓存的响应。

示例:/api/getNumber 重定向到 <api-gateway-url>/<env>/api/getNumber 并返回 2。我更改响应以使其返回数字 300,但是当我通过浏览器发出请求时,现在没有重定向,我仍然返回第二个。 x-cache 响应标头表示来自 CloudFront 的缓存命中。

【问题讨论】:

  • 当您使用“重定向”这个词时,您的意思听起来像是“前进”。重定向是一个 HTTP 30x 响应,它告诉浏览器在不同的 URL 处重复请求。请确认您的意思是“重定向”还是 CloudFront 实际上是在转发请求。
  • @Michael-sqlbot 所以我的 CF 配置错误,它正在创建重定向而不是别名。我关注了stackoverflow.com/questions/38050191/… 并解决了这个问题。现在我每次都会收到“来自 CloudFront 的未命中”响应。但我仍然不确定 CF 不会缓存我的结果,并且希望每次都能从这个端点获得新的响应。

标签: amazon-web-services aws-api-gateway amazon-cloudfront


【解决方案1】:

AWS CloudFront 通常用于缓存,从而减少将访问后端资源的请求数量。因此,如果您想立即看到更改,则不应在测试环境中使用 CloudFront。

在您的情况下,您的端点似乎没有任何参数(路径/查询),因此基本上 CloudFront 每次看到的是相同的请求,自然在这种情况下您将访问缓存。

您有几个选项可以“修复”该问题:

  1. 多样化您的 API 请求(例如使用参数)
  2. 使用CloudFront's TTL options,让 CloudFront 保留缓存对象的时间更少

    注意:如果这是生产环境,则不建议这样做,因为它可能会消除缓存的全部意义并破坏预期的行为

  3. 对那些不带参数和/或其响应会经常变化的路径禁用 CloudFront 的缓存,从而为您的分配的其余部分保持缓存:

    https://aws.amazon.com/premiumsupport/knowledge-center/prevent-cloudfront-from-caching-files/

  4. 最后,如果这只是您的测试环境,请禁用 CloudFront,但上述内容可能稍后会应用于您的生产环境

【讨论】:

  • 关于第 3 点 - 我在我的来源上添加了 Cache-Control: no-store 标头。我在回复中看到了Cache-Control: no-cache 标头,但我想这是另一个问题的问题。如果我添加此标头 CF应该 始终尊重它,我将永远不会得到缓存响应,对吗?
  • @jcharch 如果您在本文档中向下滚动一点:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 您会看到尽管 CloudFront 尊重该标题,但列出了一些例外情况。但除此之外,此选项的最后一列中还显示:“CloudFront 缓存 CloudFront 缓存对象以获得 CloudFront 最小 TTL 的值。”
猜你喜欢
  • 2018-03-11
  • 2020-02-03
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多