S3静态托管 - 没有index.html的路径

时间:2018-06-09 01:34:02

标签: angular amazon-web-services amazon-s3 amazon-cloudfront

我们有多个Angular项目,我们希望快速上传到s3以获得QA&测试。 我们将所有这些文件上传到不同子文件夹中的同一个存储桶。所以s3桶结构如下:

 -- tests-bucket
    -- project1
       -- index.html
    -- project2
       -- index.html

然后我们有一个云端分发和route53设置,例如tests.domain.com。

通过完整路径访问项目时,一切正常:

tests.domain.com/project1/index.html
tests.domain.com/project2/index.html

但是,当我们尝试访问没有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>

这使我们很难进行测试,因为在初始页面加载后,index.html会自动删除,任何额外的重新加载都会导致404错误。

该存储桶设置为提供网站静态托管,索引和错误文档都指向index.html

CloudFront分配也设置为将404错误路径重定向到index.html。

似乎此设置仅适用于存储桶tests.domain.com/index.html的根路径,但不支持子目录。

This AWS article似乎可以,但在我们的例子中,它不适用于SPA / Angular应用程序。

通过对此的快速研究,我发现this tutorial使用Lamda Edge重定向解决了这个问题,但设置似乎有点矫枉过正,而且似乎只支持美国东部分发。

是否有任何可以解决此问题的简单配置,仅使用不涉及lambda函数的s3 / cloudfront / route53?

1 个答案:

答案 0 :(得分:1)

是的,你可以使用&#34; index-document&#34;来配置它。当您在存储桶中启用网站托管时的属性。查看CLI文档:https://docs.aws.amazon.com/cli/latest/reference/s3/website.html

启用此功能后,将在不以文件结尾的每个路径上启用此功能。所以要求&#34; / project1 /&#34;将返回&#34; /project1/index.html"如果您将index-document属性设置为&#34; index.html&#34;

更多文档:

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(具体而言,&#34;但是,如果您定义了默认的根对象,则对您的发行版子目录的最终用户请求不会返回默认的根对象。例如,假设为索引。 html是您的默认根对象,CloudFront会在您的CloudFront分配下收到安装目录的最终用户请求&#34;)