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