S3静态托管-不含index.html的路径

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/project1tests.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?

Pat*_*ick 5

是的,当您在存储桶中启用网站托管时,可以使用“ 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发行版下的安装目录的请求”)

  • 我完全不知道您是否已设置它使用Cloudfront,并在提到SSL时发现了这一点。由于您已经在Cloudfront中进行了设置,因此Cloudfront的默认根对象检测将覆盖您的s3索引文档(假设您已将其设置为s3原始文档)。如果将Cloudfront更改为使用自定义来源并将其指向s3托管URL,则它应该可以解决您的问题。我将编辑答案以包括该细节。 (2认同)