【发布时间】:2021-02-15 08:27:13
【问题描述】:
我通过 Cloudfront 在 S3 存储桶上提供 Angular 应用程序的静态文件。我的 Cloudfront 发行版设置了错误页面,因此它仍然呈现 Angular 的 index.html。这意味着,如果我请求 <cloudfront-distribution>.cloudfront.net/home-page,而不是说它在 S3 存储桶上没有找到名为 home-page 的文件,它仍然会渲染 Angular 应用程序,而 Angular 应用程序将处理该 /home-page 路由。
我需要在应用服务器上包含一些安全标头,因此我设置了一个 Lambda@Edge 函数以在查看器响应事件中注入这些标头(如此处所述 https://aws.amazon.com/blogs/networking-and-content-delivery/adding-http-security-headers-using-lambdaedge-and-amazon-cloudfront/)。
Lambda@Edge 正在处理实际上对应于 S3 存储桶中的文件的路由(如果我在 S3 存储桶的根文件夹中有一个名为 image.png 的文件,并且我请求 <cloudfront-distribution>.cloudfront.net/image.png,我会看到我通过 Lambda@Edge 函数注入的响应标头。问题是访问与 S3 存储桶中的文件不对应的路由时。如果我访问 <cloudfront-distribution>.cloudfront.net/home-page,S3 将返回 404,Cloudfront 将处理 404并根据错误页面配置采取相应的行动,即响应 200 状态代码并呈现 index.html 文件。发生这种情况时,我看不到我通过 Lambda@Edge 函数注入的任何标头,而所有我的 Angular 应用程序的其他脚本文件有标题。
如何使所有响应都通过 Lambda@Edge 函数?
【问题讨论】:
-
您能否确认您的 Lambda@Edge 已配置为在 Origin Response 事件上运行?
-
其实没有。 Lambda@Edge 在查看器响应事件上运行。我尝试将其设置为 Origin Response,但结果根本没有标头(甚至在与 S3 存储桶上的文件匹配的路由上也没有)
标签: angular amazon-web-services amazon-s3 amazon-cloudfront aws-lambda-edge