首页 > 解决方案 > 尽管 Cache-Control: no-cache 标头和最小 TTL 为 0,CloudFront 仍返回缓存错误响应

问题描述

我正在构建一个 SPA,前端由 S3 托管,后端由 Lambda 和 API Gateway 提供服务。我正在尝试使用 CloudFront 坐在 S3 和 API Gateway 的前面,以便使用相同的域名来避免 CORS 问题并使用没有Domain属性的 cookie。

但是,我是 CloudFront n00b,CloudFront 中有一些我不理解的缓存行为。

出于某种原因,客户端发出的一些 API 请求正在接收 403 响应,但该请求没有发送到 Lambda——响应似乎是来自 CloudFront 的缓存错误响应。最奇怪的部分是错误响应甚至不是从该(或任何)URL 收到的最新响应。403 响应的响应正文与我的 API 服务器为发送到的未经身份验证的请求发送的内容相匹配/api/*

以下是客户端发出的 XHR 请求: 客户请求

所有这些 API 调用(包括/api/activities/history/)在响应中都有一个cache-control标头,我认为这会阻止这些响应中的任何一个被缓存:

cache-control: max-age=0, no-cache, no-store, must-revalidate, private

如果有帮助,客户端收到的最后一个响应包含x-cache来自 CloudFront: 的标头x-cache: Error from cloudfront

以下是来源收到的请求:

[12/Jul/2020:19:44:16 +0000] "GET /api/user/ HTTP/1.1" 200 29 "" "Amazon CloudFront" 0/10.349
[12/Jul/2020:19:44:18 +0000] "GET /api/activities/history/ HTTP/1.1" 200 2036 "" "Amazon CloudFront" 0/1819.5900000000001
[12/Jul/2020:19:44:29 +0000] "GET /api/activities/in-progress/ HTTP/1.1" 200 139 "" "Amazon CloudFront" 0/3773.864
[12/Jul/2020:19:44:50 +0000] "GET /logout/ HTTP/1.1" 302 0 "" "Amazon CloudFront" 0/23.132
Forbidden: /api/user/
[12/Jul/2020:19:44:51 +0000] "GET /api/user/ HTTP/1.1" 403 58 "" "Amazon CloudFront" 0/1.839
[12/Jul/2020:19:45:12 +0000] "GET /login/github/ HTTP/1.1" 302 0 "" "Amazon CloudFront" 0/5.914
[12/Jul/2020:19:45:15 +0000] "GET /complete/github/ HTTP/1.1" 302 0 "" "Amazon CloudFront" 0/2289.144
[12/Jul/2020:19:45:16 +0000] "GET /api/user/ HTTP/1.1" 200 29 "" "Amazon CloudFront" 0/4.989999999999999
[12/Jul/2020:19:45:17 +0000] "GET /api/activities/in-progress/ HTTP/1.1" 200 139 "" "Amazon CloudFront" 0/714.226

您会注意到/api/activities/history/这里没有出现 403 响应。仅供参考,/logout/, /login/github/,/complete/github/请求来自同一个客户端,但是来自客户端的文档请求,这就是它们没有出现在上面的屏幕截图中的原因。

为了向上面发生的事情添加更多细节,当前端加载时,它会向/api/user/API 端点发出请求。如果请求通过了身份验证,那么前端会同时向/api/activities/in-progress/和发出请求/api/activities/history/。否则,将向用户显示登录页面。在上面显示的会话中,我能够完全呈现主页,然后我注销,加载主页并从/api/user/呈现登录页面收到 403。然后我点击登录按钮,被重定向到 Github,被重定向回来,然后收到 200 从/api/user/生成并发请求到/api/activities/in-progress//api/activities/history/. 最后一个 API 请求是失败的,但不应该。

以下是 CloudFront 行为设置/api/*CloudFront 行为设置

如您所见,我正在使用源的缓存标头。

我还为 403 响应创建了一个自定义错误响应,以防止缓存这些响应: CloudFront 错误页面

/api/activities/history/任何想法为什么我会在来自该 API 端点的最新响应是 200 时获得缓存的 403 响应请求?

抱歉,问题很长,但非常感谢您的阅读!

编辑:我发现并发 API 请求似乎是这个问题的核心。如果我更改前端逻辑以串行发出请求,那么所有请求都会按预期到达 Lambda。

标签: amazon-cloudfronthttp-status-code-403http-caching

解决方案


推荐阅读