S3静态网站索引文档

Posted

技术标签:

【中文标题】S3静态网站索引文档【英文标题】:S3 static website index document 【发布时间】:2013-12-14 10:05:41 【问题描述】:

我正在尝试将我的静态网站上传到我的 s3 存储桶。我已经成功地做到了这一点。我创建了 my_bucket,然后创建了一个名为 test_folder 的 sub_bucket,并在其中上传了所有 css、html、js 文件。

现在应该是这样的:

 my_bucket/
  test_folder
    index.html

而且我能够查看我的 index.html,太棒了! :D。但是我的问题是设置索引文档,因为 index.html 位于 sub_bucket: test_folder/index.html 当我尝试保存它时,给了我

IndexDocument 后缀格式不正确

是否可以将 index.html 链接到 sub_bucket 中?如果是,如何?如果没有,是否有其他方法可以实现这一目标?我这里有截图link

【问题讨论】:

【参考方案1】:

虽然经常用于不同的目的,但索引文档最初在概念上旨在成为每个文件夹中所有文件的“索引”(目录列表或其他内容摘要),因此此配置参数指定索引文档为整个存储桶中的每个文件夹返回,如果文件夹中存在这样的文档...这不是整个存储桶的单一配置“事物”。

如果您尝试的配置已被 S3 接受,它将产生以下影响,假设存储桶名称为“example.com”:

browser address bar          file (object) actually returned
---------------------------  ------------------------------------
http://example.com           example.com/test/index.html
http://example.com/help      example.com/help/test/index.html
http://example.com/foo/test  example.com/foo/test/test/index.html

这似乎不太可能是您真正想要的。

但是,这就是索引文档的工作方式……它们在概念上旨在与目录层次结构的每个级别的其他事物相关,这当然可能是文件的实际列表,或者可能是“索引”在任何“页面”的更广泛、模糊和一般意义上,例如您希望访问者在访问您网站上的特定“目录”时看到的登录页面,当然,在现代网络中通常不被概念化为“目录”,而是简单地被概念化为“页面”。

因此索引文档必须紧跟在同一 / 分隔符下,并且不能在其自己的规范中包含额外的 /

example.com 的索引文档必须存储在 example.com/index.html 中(假设“index.html”是您选择的索引文件名)——它必须存储在它索引的“目录”中,就像在传统的 Web 服务器上一样,在某些配置中,Web 服务器实际上会显示文件的目录列表,在“索引”页面实际存在的情况下,“索引”页面会替换该目录列表。当然,S3 没有默认的目录列表页面功能。

http://docs.aws.amazon.com/AmazonS3/latest/dev/IndexDocumentSupport.html

与索引文档相比,错误文档(如果您对其进行配置)是一个全局配置,无论在存储桶内的哪个位置出现 404,都会使用该配置,因此该条目中支持斜杠。 AWS 控制台提示对这两个条目的性质进行了简单的提示,它们的行为如此不同,因此可以说它们应该在视觉上更加分开。


您会注意到,对于您所描述的内容,“子存储桶”不是一个实际术语,它是一个在其键(路径)中带有分隔符的对象,它看起来像是嵌套在目录下或文件夹。

为了清楚起见,我在整个答案中非常随意地使用了“文件夹”和“目录”这两个词,具有传统含义......但为了技术准确性,我会提到 S3 对象并没有真正存储在内部“在目录中”的分层方式。它以这种方式出现,并且出于实际目的,它以这种方式工作;然而,/ 字符实际上是这种情况,虽然它几乎只是对象键中的另一个字符,尽管由于它通常用作目录分隔符,因此它作为分隔符得到了一些特殊处理。与一些更传统的文件系统不同, “每个目录中的文件数”不会对 S3 造成任何性能问题,并且不需要像存在大量文件时以传统文件系统中所需的方式进行管理,因为 S3 internally hashes the key (" path") 每个对象的内部存储分区逻辑。

【讨论】:

之所以要将索引文档指向我的test_folder/index.html,因为我的存储桶内还有其他folders。而且当我访问我的浏览器时http://mybucket/test_folder 给了我一个Access Denied Issue 这似乎是一个非常冗长的答案,要说“将您的 index.html 放在根目录中”。 那么,您可能想再读一遍,因为它实际上并不是这么写的。索引文档名称是 name,而不是 path。将它们放在您需要的任何地方,但要了解,与错误文档不同,它们是根据上下文限定/解决的。【参考方案2】:

我也有这个问题。根据迈克尔的回答,我开发了这个解决方法:

在 Amazon S3 存储桶属性中,将 Index Document: 值设置为任意值(我使用了“index.htm”,并且存储桶的“根”中没有 index.htm 文件。然后设置错误文档:值到您希望用户发送到的任何位置(在您的情况下为 test_folder/index.html)。

请记住,您网站上的任何 404 错误消息都会发送到指定页面。我知道这是一个可怕的工作,但它似乎对我有用。任何其他建议都非常感谢!

【讨论】:

我对聪明的黑客并不陌生,这很聪明,但问题是这可能无法跨浏览器工作,因为即使 S3 返回指定的错误页面的内容,它仍然 将 HTTP 响应代码设置为 404 Not Found: "但是,请注意,当发生错误时,某些浏览器会显示自己的错误消息,而忽略 Amazon S3 返回的错误文档。例如,当 HTTP 404发生 Not Found 错误,Chrome 可能会显示自己的错误,而忽略 Amazon S3 返回的错误文档。" docs.aws.amazon.com/AmazonS3/latest/dev/… @Michael-sqlbot 没错,但您可以使用 CloudFront 将错误代码更改为 200 @hcarreras 这也是正确的,尽管返回错误代码确实不好。我的这条评论已经很老了,我今天的建议是验证错误文档的长度是否足以抑制任何内置错误,必要时使用大的评论块。【参考方案3】:

我一直在尝试做同样的事情(从 s3 提供静态服务)并且阅读这篇文章让我意识到您需要将索引文件(例如'index.html')放在桶中外部 em> 的任何文件夹。

我的索引文档位于模板文件夹中。我已经阅读了文档,但我非常沮丧,以至于我无法理解它的真正含义。有时,真正愚蠢的错误是最难解决的。希望这对某人有所帮助。

【讨论】:

【参考方案4】:

另一种方法是 如果您在 S3 中使用(或使用)cloudfront,您可以拥有

DefaultRootObject:test_folder/index.html

这样您的云端 url https://yourdomain/ 将返回 test_folder/index.html

【讨论】:

【参考方案5】:

尝试在“索引文档”单元格中填写index.html

【讨论】:

哈!我正在查看建议的文本,没有意识到它还没有填写。谢谢!【参考方案6】:

最简单的方法应该是在云端使用 s3 并在选择存在该“文件夹”的存储桶后将 Origin Path 设置为 test_folder/index.html

【讨论】:

【参考方案7】:

我意识到我在一年后访问了这个帖子,希望再次做同样的事情。由于这里没有答案提到使用Custom Origin 而不是S3 Origin 这是最简单的解决方案,因此我将在此处发布此内容。这是由'D.建议的。 Svanlund' 在这个AWS thread。完成此操作后,您不必将 / 放入浏览器或 s3/cloudfront 设置中。干杯!

不要使用S3 Origin,而是在您的云端分发Origins and Origin Groups设置选项卡中使用Custom Origin

您必须在 Origin Domain Name 字段中使用您的 s3 存储桶网址 (myawesomebucket.s3-website-us-east-1.amazonaws.com)。您可以从存储桶Properties 选项卡中找到您的 S3 存储桶网址。

在我的 S3 的 Static website hosting 设置中,我还把 index.html 放在了 Index document 字段中。

【讨论】:

以上是关于S3静态网站索引文档的主要内容,如果未能解决你的问题,请参考以下文章

我可以从不同的 S3 存储桶提供静态网站的一部分吗?

将外部域名连接到AWS S3网站

仅由 API Gateway 访问的私有 S3 静态网站

使用 Bucketname 时的 S3 静态网站托管?

静态 S3 网站端点未通过 HTTPS 重定向

为啥托管静态网站时 Amazon S3 存储桶名称必须与网站名称相同