dev*_*ev7 3 amazon-s3 amazon-web-services amazon-cloudfront angular
我们有多个Angular项目,我们希望将它们快速上传到s3进行质量检查和测试。我们将它们全部上传到相同子桶中的不同子文件夹中。因此s3存储桶结构如下:
-- tests-bucket
-- project1
-- index.html
-- project2
-- index.html
Run Code Online (Sandbox Code Playgroud)
然后,我们有一个云前端分布和route53设置,例如tests.domain.com。
通过完整路径访问项目时,一切正常:
tests.domain.com/project1/index.html
tests.domain.com/project2/index.html
Run Code Online (Sandbox Code Playgroud)
但是,当我们尝试不使用index.html(tests.domain.com/project1
或tests.domain.com/project1/
)访问项目时,会出现以下错误:
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>index.html</Key>
<RequestId></RequestId>
<HostId></HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
这使我们很难测试,因为在初始页面加载后,index.html
会自动删除,并且任何其他重新加载都会导致404错误。
该存储段设置为服务网站静态托管,索引和错误文档均指向index.html
。
CloudFront发行版还设置为将404错误路径重定向到index.html。
似乎此设置仅适用于存储桶的根路径,tests.domain.com/index.html
但不支持子目录。
这篇AWS文章似乎有可能,但是在我们的情况下,它不适用于SPA / Angular应用程序。
通过对此的快速研究,我找到了本教程,该教程使用Lamda Edge重定向解决了此问题,但该设置似乎有些过头,而且似乎仅支持美国东部发行。
是否有任何简单的配置可以解决此问题,仅使用不涉及lambda函数的s3 / cloudfront / route53?
是的,当您在存储桶中启用网站托管时,可以使用“ index-document”属性进行配置。在此处查看CLI文档:https : //docs.aws.amazon.com/cli/latest/reference/s3/website.html
启用此功能后,将在所有未以文件结尾的路径上启用该功能。因此,如果将index-document属性设置为“ index.html”,则请求“ / project1 /”将返回“ /project1/index.html”
更多文档:
https://docs.aws.amazon.com/AmazonS3/latest/dev/IndexDocumentSupport.html
https://docs.aws.amazon.com/AmazonS3/latest/dev/HostingWebsiteOnS3Setup.html
编辑:
使用Cloudfront时,cloudfront中的默认根对象行为将覆盖S3中的索引文档用法。要解决此问题,请不要使用S3来源,而应使用自定义来源,并通过S3存储桶URL作为来源域名。
说明文件:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html(具体来说,“但是,如果您定义默认的根对象,则最终用户对您的发行子目录的请求不会返回默认的根对象。例如,假设index.html是您的默认根对象,并且CloudFront收到最终用户对您在CloudFront发行版下的安装目录的请求”)