2

我想在 AWS 存储桶上托管 Web 项目的图像,然后在呈现 HTML 时动态拉取它们。这给我带来的麻烦比我预期的要多得多。

这是有问题的标签:

<img src="https://s3.us-east-2.amazonaws.com/ibidnyc/Summer Smith/VERBAL/subsections/Summer-Smith-VERBAL-subtopic-POETRY-fig.jpg" alt="">

当我这样做时,我收到一个跨域读取阻止 (CORB) 错误(在检查器中;我正在运行 Chrome)——显然,Chrome 在某些情况下会阻止链接到其他网站上的 img 源?粗略的搜索把我带到了这里(zyst.io/how-to-fix-aws-s3-chrome-and-safari-cors-on-images),但我不知道如何应用它。此外,这篇文章针对的是 CORS,而不是 CORB(我认为它是更新的?)。

4

2 回答 2

0

事实证明@Brad 是对的。虽然我已将存储桶实例化为公开的,但上传到该存储桶的单个图像仍然是私有的。

将存储桶策略更改为这个就可以了(感谢h3xed.com!):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Action": "s3:GetObject",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::[bucket_name_here]/*",
      "Principal": "*"
    }
  ]
}

存储桶策略编辑解释here。

感谢所有贡献者!

于 2020-02-26T15:42:00.800 回答
0

这是一篇与 CORB 相关的好 StackOverflow 帖子。

具体来说,这是我认为可能有帮助的部分:

在大多数情况下,被阻止的响应不应影响网页的行为,并且可以安全地忽略 CORB 错误消息。例如,当被阻止的响应的主体已经为空时,或者当响应将被传递到无法处理它的上下文(例如,HTML 文档,如 404 错误页面)时,可能会出现警告被传送到<img>标签)。

https://www.chromium.org/Home/chromium-security/corb-for-developers

尝试清除缓存并确保从该 AWS 链接返回的数据确实是图像而不是其他类型的数据。当我在浏览器中打开该 AWS 链接时,我得到一个 XML 错误页面,而不是图像:

<Error>
    <Code>PermanentRedirect</Code>
    <Message>
       The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
    </Message>
    <Endpoint>s3.amazonaws.com</Endpoint>
    <Bucket>ibidnyc</Bucket>
    <RequestId>FF65E772274735DF</RequestId>
    <HostId>
        VW+SBil/6NVWG5lx0F1XmWSDJLTjwaTHbBPoVQQlDNV+71NY4eDQLJraGtM+pBSyjas3ByFKIis=
    </HostId>
</Error>

在研究那个 XML 错误时,我发现这个存储桶很可能是在不同的区域创建的,即 ienot us-east-2。那是我唯一一次看到这个端点错误。

美国标准是 us-east-1

将您的 URL 更改为 us-east-1 后,我现在收到 AccessDenied 错误,因此我假设已找到该图像并且您将能够访问它。

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>19E4B33430F54214</RequestId>
    <HostId>
        MF/m6yUhslgB3aB3ddoqnKwRAeABQq17wkaIqX09hwrvaZ+jPm8oIEVAY9HQpG5MShOp1Jf/HIg=
    </HostId>
</Error>
于 2020-02-26T15:04:24.797 回答