为 CloudFront 上的不同 S3 源指定不同的错误行为

问题描述 投票:0回答:1

我有以下情况,我需要如何继续的帮助:

  • 我在私有 S3 存储桶中有一个多页面网站。它使用 OAI 允许 CloudFront 发行版在

    example.com
    分发此网站。

  • 我有一个单页应用程序托管在另一个私有 S3 存储桶中。它使用 OAI 允许相同的 CloudFront 发行版在

    example.com/app
    上分发网站。 CloudFront 发行版包含一个“附加行为”,它将请求定向到应用程序的 S3 存储桶的路径
    /app*

我的问题在于我需要两个来源有不同的错误行为。第一个源(包含网站的 S3 存储桶)在 404 Not Found 上返回

404.html

。这很简单;我可以指定发行版使用此文件路径的错误响应。问题是,第二个源(在 
example.com/app
 提供服务的 SPA)需要在 404 上返回其 
index.html
 文档,因为它是 SPA。我无法在 CloudFront 中针对每个源指定错误处理。

我有两个已知的解决此问题的方法:

    使用 S3 上的 SPA 静态网站功能并在那里指定其错误文档。
  1. 创建 Lambda@Edge 函数以某种方式自定义
  2. /app*
     的 URI 的错误处理行为。
我的理解是,建议避免 S3 的静态网站功能,而是使用 CloudFront 的 OAI,所以我更愿意实现选项 2。但是,我在编写必要的功能时遇到了麻烦,并且找不到有人实施类似措施的任何例子。任何有关此问题的指导或帮助将不胜感激 - 无论是在实现上述目标方面还是在是否有更好的策略方面。

amazon-web-services amazon-s3 aws-lambda amazon-cloudfront
1个回答
0
投票
您可以将 S3 源保留为存储桶,而不使用静态网站终端节点,并使用 CloudFront Functions 重写对 SPA 的 index.html 的所有请求。这将取代您的自定义错误页面处理。像这样的东西应该有效:

function handler(event) { var request = event.request; request.uri = '/index.html'; return request; }
    
© www.soinside.com 2019 - 2024. All rights reserved.