设置访问网站的权限
将存储桶配置为静态网站时,如果希望网站成为公有网站,则可以授予公有读取访问权限。要使存储桶公开可读,您必须禁用存储桶的阻止公有访问设置并编写一条授予公有读取访问权限的存储桶策略。如果存储桶包含并非由存储桶拥有者拥有的对象,您可能还需要添加对象访问控制列表 (ACL),以便向所有人授予读取访问权限。
如果您不想禁用存储桶的阻止公共访问设置,但仍希望将自己的网站公开,则可以创建 Amazon CloudFront 分配来为静态网站提供服务。有关更多信息,请参阅使用 Amazon CloudFront 为网站提速或《Amazon Route 53 开发人员指南》中的使用 Amazon CloudFront 分配为静态网站提供服务。
注意
在网站端点上,如果用户请求了不存在的对象,则 Amazon S3 将返回 HTTP 响应代码 404 (Not Found)
。如果该对象存在,但您尚未授予对对象的读取权限,则网站端点将返回 HTTP 响应代码 403 (Access Denied)
。用户可以使用该响应代码推断特定对象是否存在。如果您不需要此行为,则不应启用对存储桶的网站支持。
步骤 1:编辑 S3 阻止公有访问设置
如果要将现有存储桶配置为具有公有访问权限的静态网站,您必须编辑该存储桶的阻止公有访问设置。您可能还必须编辑账户级别的阻止公有访问设置。Amazon S3 会应用限制性最强的存储桶级别和账户级别的阻止公有访问设置的组合。
例如,如果您允许对存储桶进行公有访问,但阻止账户级别的所有公有访问权限,则 Amazon S3 将继续阻止对存储桶进行公有访问。在这种情况下,您将必须编辑存储桶级别和账户级别的阻止公有访问设置。有关更多信息,请参阅 阻止对您的 Amazon S3 存储的公有访问。
默认情况下,Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站,您可以使用以下步骤编辑您的屏蔽公共访问权限设置。
警告
在完成这些步骤之前,请查看阻止对您的 Amazon S3 存储的公有访问,来确保您了解并接受支持公共访问权限所涉及的风险。当您关闭屏蔽公共访问权限设置以使您的存储桶变为公有时,Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。
-
通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
请选择已配置为静态网站的存储桶的名称。
-
选择权限。
-
在屏蔽公共访问权限(存储桶设置)下,请选择编辑。
-
清除阻止所有公有访问,然后选择保存更改。
Amazon S3 关闭了存储桶的屏蔽公共访问权限设置。要创建公有静态网站,可能还必须为您的账户配置屏蔽公共访问权限设置,然后再添加存储桶策略。如果当前已开启账户的屏蔽公共访问权限设置,您将在屏蔽公共访问权限(存储桶设置)下看到一条备注。
步骤 2:添加存储桶策略
要使存储桶中的对象公开可读,您必须编写一条向所有人授予 s3:GetObject
权限的存储桶策略。
在编辑 S3 阻止公有访问设置后,您可以添加存储桶策略以授予对存储桶的公有读取访问权限。当您授予公有读取访问权限时,Internet 上的任何人都可以访问您的存储桶。
重要
下面的策略仅供举例说明,仍允许完全访问您存储桶的内容。在继续执行此步骤之前,请查看如何保护 Amazon S3 存储桶中的文件?
-
在存储桶 下,请选择存储桶的名称。
-
选择权限。
-
在存储桶策略下,请选择编辑。
-
要授予对网站的公有读取访问权限,请复制以下存储桶策略,将其粘贴到存储桶策略编辑器中。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::
Bucket-Name
/*" ] } ] } -
将
Resource
更新为您的存储桶名称。在上述示例存储桶策略中,
Bucket-Name
是存储桶名称的占位符。要将此存储桶策略用于您自己的存储桶,您必须更新此名称以匹配您的存储桶名称。 -
选择保存更改。
此时将显示一条消息,指示存储桶策略已成功添加。
如果您看到显示
Policy has invalid resource
的错误,请确认存储桶策略中的存储桶名称与您的存储桶名称匹配。有关添加存储桶策略的信息,请参阅如何添加 S3 存储桶策略?如果您收到错误消息且无法保存存储桶策略,请检查您的账户和存储桶的阻止公有访问设置以确认您允许对存储桶进行公有访问。
对象访问控制列表
您可以使用存储桶策略来授予对对象的公共读取权限。但是,存储桶策略仅适用于存储桶拥有者所拥有的对象。如果存储桶包含并非由存储桶拥有者拥有的对象,则存储桶拥有者应使用对象访问控制列表 (ACL) 授予对这些对象的公有 READ 权限。
S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权和禁用或启用 ACL。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对这些对象的访问权限。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态,除非有需要单独控制每个对象的访问权限的特殊情况。禁用 ACL 后,您可以使用策略来控制对存储桶中所有对象的访问权限,无论是谁将对象上传到您的存储桶。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。。
重要
如果您的存储桶针对 S3 对象所有权使用强制存储桶拥有者设置,则必须使用策略授予对存储桶及其中对象的访问权限。启用强制存储桶拥有者设置后,设置访问控制列表(ACL)或更新 ACL 的请求将失败并返回 AccessControlListNotSupported
错误代码。我们仍然支持读取 ACL 的请求。
要使用 ACL 使对象公开可读,您可以向 AllUsers
组授予 READ 权限,如以下授权元素所示。可以将此授权元素添加到对象 ACL 中。有关管理 ACL 的信息,请参阅 访问控制列表 (ACL) 概述。
<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI> </Grantee> <Permission>READ</Permission> </Grant>