Amazon S3 存储桶中缺少 Access-Control-Allow-Origin 标头

Posted

技术标签:

【中文标题】Amazon S3 存储桶中缺少 Access-Control-Allow-Origin 标头【英文标题】:Missing Access-Control-Allow-Origin headers from Amazon S3 bucket 【发布时间】:2015-07-18 08:51:36 【问题描述】:

我的 Amazon S3 存储桶具有以下 CORS 配置。问题是配置似乎被完全忽略了。从存储桶请求对象时,我没有收到任何 Access-Control-Allow-Origin 标头。是否有任何家庭有类似的问题或调试提示?

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://www.example.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>http://localhost:8100</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>

这是我的存储桶策略:


"Version": "2012-10-17",
"Statement": [
    
        "Sid": "AddPerm",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::example.com/*"
    
]

【问题讨论】:

您在获取资产时使用的是 S3 端点还是网站端点? @RakeshBollampally 我没有使用网站端点。 我必须使用网站端点吗? 是的。我认为 S3 端点不支持 CORS 或标头 根据@bk0s 的回答,它似乎也适用于 S3 端点。 【参考方案1】:

我不确定您为什么要添加额外的 xml 信息,因为我在 S3 文档中没有看到这一点。简单地说,这应该有效:

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>http://www.example.com</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>http://localhost:8100</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

【讨论】:

【参考方案2】:

您必须在请求中提供 Origin 标头才能在响应中获取 Access-Control-Allow-Origin 标头。

使用卷曲:

$ curl -XGET -H 'Origin: www.example.com' https://my-bucket.s3.amazonaws.com/doc/2006-03-01/

请注意--与文档相反--即使您没有在存储桶上启用“静态网站托管”,CORS 配置也会受到尊重。您可以通过存储桶子域(如上)或通过完整路径访问存储桶:https://s3.amazonaws.com/my-bucket/doc/2006-03-01

【讨论】:

仍然没有区别 :-( 我仍然可以访问存储桶中的所有文件而无需指定原始标头。我是否需要调整存储桶策略中的任何内容?用我的策略内容更新了我的问题。 @sebbo - 我认为你误解了 CORS 的作用。解释见这里:***.com/a/10636765/2838391CORS 用于跨域资源共享。对于某些类型的文件,CORS 将不适用。 @sebbo - 不正确。您可以在不指定来源的情况下获取资产。此标头用于浏览器。 浏览器下载文件后,会检查文件头并判断请求页面是否违反了浏览器的跨域策略。 CORS 是一种用于客户端 javascript 的安全机制。我想除非您通过 JS 加载图像,否则不会发送 Origin 标头。 @sebbo - 为了保护资产,最好的方法是生成签名 URL。你的应用程序是动态的吗?检查此 php 示例代码:docs.aws.amazon.com/aws-sdk-php/v2/guide/…

以上是关于Amazon S3 存储桶中缺少 Access-Control-Allow-Origin 标头的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 Amazon S3 存储桶中的文件? [复制]

列出 Amazon S3 存储桶中所有文件的快速方法?

动态获取 Amazon S3 存储桶中文件的大小

Amazon S3 boto:如何重命名存储桶中的文件?

使用 Node JS 从 Amazon S3 私有存储桶中检索图像

我们如何为 Amazon S3 存储桶中的文件夹设置 CORS