似乎有两种方法可以在 S3/CloudFront 上托管静态网站。
- 创建具有完全公共访问权限且静态网站设置为已启用 + CloudFront 配置的 S3 存储桶
- 创建没有公共访问权限的 S3 存储桶并将静态网站设置为已禁用 + CloudFront 配置
我不喜欢 (1) 是公开访问的刺眼的“不要这样做”红色文本。但它完美地工作。
我不喜欢 (2) 的地方是我失去了静态网站设置为已启用的好处,就像所有内容都自动重定向到index.html
. 现在我看到root origin
CloudFront 设置中有一个对象,但这仅适用于我的基本域(例如mysite.com
)。我的网站是一个 SPA,并且(1)如果我去mysite.com/profile
它会正确地去mysite.com/index.html
我认为因为我设置了 404 重定向。但是(2)去mysite.com/profile
的不是 404,而是 403 访问被拒绝,我认为像 404 那样重定向并不明智。
那么即使是关于公共访问的刺眼红色文本,我是否应该坚持选项(1)?或者是否有适当的方法在没有公共访问/静态网站托管的情况下进行 SPA?
对于托管在 S3 上的网站,可以安全地忽略公共访问警告。存储桶/文件是故意公开的。启用网站托管后,AWS 可能应该禁用该警告。
CloudFront 分配显然会提供更好的性能,但对于单页应用程序,它可能不足以打扰,您的调用基于您的用户/应用程序的知识。与其依赖 Web 服务器来发出重定向,您可以不在您的应用程序中对其进行编码,以便链接是您想要的方式吗?您可以使用 CloudFront@Edge 进行重定向,但这需要额外的工作并增加一定程度的额外成本。
我会选择第二个选项。S3 存储桶保持私有状态,并授予云端原始访问身份 (OAI) 的只读访问权限。并且您确保通过云端优化请求,而不是通过 s3 网站端点。
为了绕过解析 index.html,您可以使用 lambda@edge 函数或 cloudfront 函数。AWS 文档中有后者的示例:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/example-function-add-index.html