amazon-web-services - 如何使用包含多个来源的 AWS Cloudfront 处理 403 和 404 错误
问题描述
我在 AWS 中有当前配置:
S3 存储桶设置为我的前端的静态网站
ELB,我的后端有一个 EC2 实例
具有两个来源、两种行为和两个自定义错误页面的 Cloudfront 分发
- 起源:
- S3 存储桶(静态网站)
- dev-api.mydomain.com(下面提到的指向 ELB 的别名记录)
- 行为:
- "/api/*" 路由到 dev-api.mydomain.com
- “*”路由到 S3
- 错误页面(这部分对我的问题最重要):
- 403 使用 index.html 返回 200 响应(来自 S3)
- 404 使用 index.html 返回 200 响应(来自 S3)
- 起源:
53 号公路:
- 注册域名
- dev.mydomain.com 指向云端分发
- dev-api.mydomain.com 指向 ELB
如何区分从 S3 和后端服务器返回的 403 和 404 错误?
注意:我使用 react 路由器来处理静态网站中的所有路由,因此对 S3 的每个请求都会从 S3 返回 404,除非用户特别要求 /index.html 资源。
场景 1:当用户访问 dev.mydomain.com/logi(登录错误)时,我希望它会命中我的 S3 存储桶并返回 404,然后它将获取存储桶中的 index.html 文件。Cloudfront 将返回具有 200 OK 状态的 index.html 文件,我的应用程序将通过显示 404 页面来处理无效路由。
场景 2:当用户访问 dev.mydomain.com/login 时,它会访问我的 S3 存储桶,返回 404 并返回 index.html 文件。一旦我登陆登录页面,为了这个例子,我会向 dev.mydomain.com/api/non_existant_route 发起一个网络请求。我希望它会访问我的 API 服务器并返回 404,然后我的前端将通过显示有关 API 请求失败的错误消息来处理它。
然而,场景 2 中发生的情况是 404 从我的后端服务器返回到 Cloudfront,然后返回 index.html 文件(来自 S3)作为带有 200 状态代码的响应。
所以,我的问题是 - 是否可以将 Cloudfront 配置为根据发回错误代码的来源返回不同的错误页面?如果没有,我怎样才能完成为后端服务器返回正确的响应?
是否需要我重新设计我的 AWS 解决方案?
解决方案
通过从云端删除自定义错误响应,我能够解决 403 和 404 问题。
我在路由到我的 S3 存储桶的默认行为 (*) 上创建了 Lambda@Edge 函数。在 Origin Request 上,该函数会修改对 /login 等页面的请求,以改为从存储桶中返回 /index.html。
推荐阅读
- javascript - 如何在 Github 中自动打开 PR 列表?
- excel - 带有不需要的文件的 Python 复制和过去目录
- vb.net - 如何在vb中不调用contruvtor继承
- apache-spark - 在 Spark 中使用 dropduplicates() 对应用程序性能的利弊
- javascript - Mongo 基于嵌套日期参数返回数据
- excel - VBA 将 R1C1 公式更新为表格公式
- flutter - 将时间选择器添加到颤动代码会导致错误
- sql - impala 的 SQL Case 语句
- wordpress - Wordpress [Elementor pro + 海洋 WP 主题 + 插件 Asgaros 论坛]
- c++ - 在没有顶点描述符失效的情况下在 boost 中有一个 DAG 图