amazon-cloudfront - 尽管 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/*
。
所有这些 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 请求是失败的,但不应该。
如您所见,我正在使用源的缓存标头。
我还为 403 响应创建了一个自定义错误响应,以防止缓存这些响应:
/api/activities/history/
任何想法为什么我会在来自该 API 端点的最新响应是 200 时获得缓存的 403 响应请求?
抱歉,问题很长,但非常感谢您的阅读!
编辑:我发现并发 API 请求似乎是这个问题的核心。如果我更改前端逻辑以串行发出请求,那么所有请求都会按预期到达 Lambda。
解决方案
推荐阅读
- html - 为什么我的第三张图片不与其他图片对齐?
- c++ - 在 C++ 中使用来自另一个头文件的抽象类
- c++ - 如何在 websocketpp 中使用自定义记录器?
- javascript - 用#屏蔽字符串
- javascript - 如何比较打字稿中的json数组
- vuejs2 - (VUE / VUEX) 从 API 调用中获取和解析数据的最佳实践
- javascript - 如何使用 Selenium 和 Javascript 修复无法读取 null 错误的属性“点击”
- amazon-web-services - 我应该每次都运行 Glue 爬虫来获取最新数据吗?
- c# - 如何检查 DbMappingViewCache 是否缓存了预编译的视图
- java - 带有 ScrollPane 的 JavaFx 中心进度指示器