在与 S3 打交道大约 10 年之后,我觉得我可能错过了一些东西。我有一个特殊情况:
https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>
是
通过 HTTP 提供对象。我希望任何人都可以使用 AWS API for GetObject 自由访问具有公共读取 ACL 的对象,无需经过 AWS 验证。但是,我不希望出现这种 http 访问行为。即使启用静态网站托管,URL 也会不同。
S3 API 作为一系列 REST API 调用(以及出于向后兼容性原因的 SOAP API 调用)实现。 具体来说,如果我们浏览 GetObject 调用的文档并删除未标记为必需的每个项目,我们将得到如下调用:
GET /Key HTTP/1.1
Host: Bucket.s3.amazonaws.com
换句话说,任何用户代理(例如浏览器)都会发送正常的 HTTPS GET 请求。 用户代理将包含其他标头,但 S3 将忽略那些它不直接支持的标头。
因此,假设一个对象不需要授权标头,因为它具有公共读取 ACL,那么浏览器将直接加载它,就像进行 GetObject 调用一样,因为实际上确实如此。