亚马逊网络服务-不带.html扩展名的S3静态页面

通过Amazon S3提供静态站点时,我想知道如何摆脱每个页面的/mypage文件扩展名。

现在我有:

mysite.com/             # works fine, serves index.html
mysite.com/mypage.html  # works fine
mysite.com/mypage       # doesn't work

/mypage的错误显示:

404 Not Found

Code: NoSuchKey
Message: The specified key does not exist.
Key: mypage
RequestId: 1089D7A26EFED9AD
HostId: Ud8cFy8Zl1mJ+oFjFOmU1Xacq9+v70KuaJfOc4nFMEPhd66AkLhr4Pj5u0QH6Gog

我已经按照这篇文章尝试将/mypage设置为/mypage.html,但它不能解决我的问题。

如何获得/mypage在S3上为/mypage.html提供文件?

Tyler asked 2019-11-17T19:40:29Z
8个解决方案
75 votes

我只是遇到了这个问题,我想分享解决方案:

您必须将文件Content-type的元数据设置为text/html,并重命名该文件以删除末尾的.html

这样,您无需文件扩展名就能访问每个页面。

André Lucas answered 2019-11-17T19:41:04Z
14 votes

通常,在Amazon S3上,要创建干净的URL,您可以:

  1. 上载具有“干净”名称的页面文件,例如 mypage,并将Content-Type设置为text/html(如您所链接的文章所述)。 在上传之前,您必须在系统上重命名该文件以使其没有扩展名,或者在上传后在S3上重命名该文件而没有扩展名。 S3上的文件名不能带有扩展名。

  2. 创建一个名称为“干净”的文件夹,然后将页面文件上传到该文件夹,并将其名称设置为默认索引文档,例如 mypage.您需要检查默认索引文档名称是什么。 当您将存储桶配置为网站时会设置此设置,但以后可以更改。

如果无法完成上述工作,则可以使用名称键mypage上载新的零字节对象,然后在上载过程中通过在元数据中指定Content-Type键并使用值text/html来设置页面重定向。 请参阅Amazon S3文档中的配置网页重定向。

您也可以将文件复制到名为mypage的新对象,并将Content-Type设置为text/html

jamtin answered 2019-11-17T19:41:56Z
7 votes

就像某些人已经说过的那样,删除文件扩展名,但只需执行以下步骤:

  1. 转到您的Amazon S3存储桶。
  2. 选中要正确链接的文件旁边的复选框。
  3. 单击右侧的“属性”,将显示一个新窗格。 它会说“对象:文件名”
  4. 单击“元数据”选项卡,将其更改为默认值,对我来说是“ binary / octet-stream”; 新值应为“ text / html”。
  5. 救。

就像人们所说的那样,请确保html中的新链接不再包含.html文件扩展名。 这对我有用。

BrotherDonkey answered 2019-11-17T19:43:00Z
4 votes

/mypage创建一个文件夹并将Index Document放入其中对我来说不起作用。 事实证明,这是因为存储桶的“索引文档”设置已更改为index.html

Bucket Properties --> Static Website Hosting --> Enable Website Hosting --> Index Document

实际上,该方法也已应用于所有子文件夹,因此在index.html路线上不会寻找Index Document。 它正在寻找myindex.html

我只是简单地将Index Document设置更改回index.html,并且标准文件夹结构有效。 设置适当的位置在任何地方使用myindex.html文件也将同样有效,但是这似乎并没有真正的好处。

我仍然不知道为什么将Index Document设置为index.html无法正常工作-好像应该在几个地方提到的那样。

无论如何,通过将Bucket的Index Document和所有子文件夹更改为使用index.html可以解决该问题。

Tyler answered 2019-11-17T19:43:53Z
3 votes

使用AWS CLI:

假设您已从文件名中删除扩展名并使用您的账户设置AWS CLI,则可以通过在控制台中运行以下命令来设置文件的元数据:

aws s3 cp /path/to/file s3://yourwebsite.com --content-type 'text/html' --acl public-read
captainblack answered 2019-11-17T19:44:25Z
1 votes

非常简单且经过测试的解决方案。 :

  1. 重命名文件,从文件名中删除扩展名(.html)。 (例如,将gallery.html更改为gallery)。
  2. 编辑文件属性。 添加元数据键(内容类型= text / html,内容语言= html)。
  3. 从浏览器网址(例如websiteurl.com/gallery)进行保存和测试。
Nirmal Bajpai answered 2019-11-17T19:45:09Z
1 votes

另一种可能的解决方案是使用Lambda @ edge电源,此处的文档参考。

Gianluca Casati answered 2019-11-17T19:45:35Z
0 votes

对于那些使用集合的人,我可以通过在末尾添加一个额外的/字符来美化链接。

collections:
  my_collection:
   output:true
   permalink: /:collection/:path/
Dylan Pierce answered 2019-11-17T19:46:01Z
translate from https://stackoverflow.com:/questions/23463679/s3-static-pages-without-html-extension