S3 - Access-Control-Allow-Origin标头

Wow*_*aaa 167 amazon-s3 amazon-web-services http-headers cors

有没有人设法添加Access-Control-Allow-Origin到响应标头?我需要的是这样的:

<img src="http://360assets.s3.amazonaws.com/tours/8b16734d-336c-48c7-95c4-3a93fa023a57/1_AU_COM_180212_Areitbahn_Hahnkoplift_Bergstation.tiles/l2_f_0101.jpg" />
Run Code Online (Sandbox Code Playgroud)

此get请求应包含在响应中,标题, Access-Control-Allow-Origin: *

我对存储桶的CORS设置如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

正如您所料,没有Origin响应头.

Fla*_*che 173

通常,您需要做的就是在存储桶属性中"添加CORS配置".

亚马逊屏幕截图

<CORSConfiguration>带有一些默认值.这就是解决问题所需的全部内容.只需点击"保存",然后再试一次,看它是否有效.如果没有,你也可以尝试下面的代码(来自alxrb答案),这似乎适用于大多数人.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration> 
Run Code Online (Sandbox Code Playgroud)

有关详细信息,您可以阅读有关编辑存储桶权限的这篇文章.

  • 对我不起作用.在HEAD或GET请求的响应中仍然没有"Access-Control-Allow-Origin"标头. (16认同)
  • 谢谢.只需单击"保存"即可加载我的字体. (6认同)
  • 这似乎是可能的.尝试阅读上面的链接(在答案中)或直接前往这个链接:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTcors.html (4认同)
  • 您可能需要将`HEAD`添加到`AllowedMethod`中 (4认同)
  • 我注意到它有时会工作,有时我在编辑后仍然会出现浏览器错误.不确定它的CloudFlare还是S3. (2认同)
  • 万一其他人也有和我类似的问题...我正在调试为什么 CORS 配置不起作用。我想检查在获取预签名 URL 之前是否可以返回适当的 CORS 配置,因此我找到了此方法:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getBucketCors-property幸运的是,我将存储桶作为我用于获取预签名 url 的常量进行传递。结果我在存储桶名称中有一个小拼写错误... getSignedUrl 端点没有给我任何指示该存储桶不存在...之后立即工作... (2认同)

alx*_*xrb 97

我在加载网络字体方面遇到了类似的问题,当我点击"添加CORS配置"时,在存储桶属性中,此代码已经存在:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>HEAD</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration> 
Run Code Online (Sandbox Code Playgroud)

我只是点击了保存并且它很有效,我的自定义网络字体在IE和Firefox中加载.我不是这方面的专家,我只是觉得这可以帮到你.

  • 我必须设置`<AllowedHeader>*</ AllowedHeader>`才能工作(最好只在这样做时才为你的网站制定新规则) (32认同)
  • 谢谢!这样做对我来说.我点击了"添加CORS配置",但没有意识到我必须点击"保存",因为我以为我在查看默认配置.D'哦. (12认同)
  • @parliament在那里有魔力,因为在<AllowedHeader>设置为通配符之前,所有其他上述设置都没有完成.欢呼. (4认同)

cod*_*hal 97

S3 现在期望规则采用 Array Json 格式。

您可以在 s3 存储桶中找到它 -> 权限然后 -> 向下滚动 -> () 跨域资源共享 (CORS)

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]
Run Code Online (Sandbox Code Playgroud)

  • 多谢。这是否在文档中的某处进行了描述?我看不到最新的任何内容:https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors (3认同)
  • 这是最新的解决方案,AWS 自动更新了我的 CORS 配置,遗漏了破坏我网站的“HEAD”属性。很好的一个! (2认同)

Sen*_*lez 38

@jordanstephens在评论中说这个,但它有点丢失,对我来说是一个非常简单的修复.

我只是添加了HEAD方法并点击了已保存并开始工作.

<CORSConfiguration>
	<CORSRule>
		<AllowedOrigin>*</AllowedOrigin>
		<AllowedMethod>GET</AllowedMethod>
		<AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
		<MaxAgeSeconds>3000</MaxAgeSeconds>
		<AllowedHeader>Authorization</AllowedHeader>
	</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

  • 这项工作截至2018年1月17日,接受的答案是一种耻辱.大声笑 (2认同)
  • 是的.当从AWS S3获取字体等内容时,这会修复Chrome中的"No'Access-Control-Allow-Origin"标题错误. (2认同)

ere*_*eit 36

如果您的请求未指定Origin标头,则S3将不在响应中包含CORS标头.这真的让我感到害怕,因为我一直试图卷曲文件来测试CORS但卷曲不包括在内Origin.

  • 有没有办法强制包含 CORS 标头而不指定 Origin? (3认同)
  • 我正在浏览互联网,因为2周,所有的文章和答案都在谈论改变我所做的S3 CORS配置,但他们的回复没有变化,直到我看到你的回答对我有意义,我用它测试了邮差和它的工作!非常感谢你 (2认同)
  • 有人知道*如何*我可以更改“img”标签的标题吗?我无法发送不同的标头,浏览器发送请求 (2认同)
  • 它是 :) https://docs.aws.amazon.com/AmazonS3/latest/dev/cors-troubleshooting.html &gt; 验证请求是否具有 Origin 标头。如果标头丢失,Amazon S3 不会处理请求作为跨域请求,并且不在响应中发送 CORS 响应标头。 (2认同)

Hor*_*cio 33

这是一种简单的方法.

我知道这是一个老问题,但仍难以找到解决方案.

首先,这对我使用Rails 4,Paperclip 4,CamanJS,Heroku和AWS S3构建的项目起作用.


您必须使用crossorigin: "anonymous"参数请求您的图像.

    <img href="your-remote-image.jpg" crossorigin="anonymous"> 
Run Code Online (Sandbox Code Playgroud)

在AWS S3中将您的站点URL添加到CORS.以下是亚马逊对此的反思.好吧,只需转到您的存储桶,然后从右侧的选项卡中选择" 属性 ",打开" 权限"选项卡,然后单击" 编辑CORS配置 ".

最初,我已经< AllowedOrigin>开始了*.只需更改星号,您的网址,一定要包括像选择http://https://在不同的线路.我期待星号接受"全部",但显然我们必须更具体.

这就是它的样子.

在此输入图像描述

  • 如果您使用的是CloudFront,您可能还需要查看此内容 - http://blog.celingest.com/en/2014/10/02/tutorial-using-cors-with-cloudfront-and-s3/ (5认同)

Fun*_*bat 19

见上面的答案.(但我也有一个铬虫)

不要在CHROME中加载和显示页面上的图像.(如果您稍后要创建一个新实例)

就我而言,我加载了图像并在页面上显示.点击它们后,我创建了一个新实例:

// there is already an html <img /> on the page, I'm creating a new one now
img = $('<img crossorigin />')[0]
img.onload = function(){
  context.drawImage(img, 0, 0)
  context.getImageData(0,0,w,h)
}
img.src = 'http://s3.amazonaws.com/my/image.png'; // I added arbitrary ?crossorigin to change the URL of this to fix it
Run Code Online (Sandbox Code Playgroud)

Chrome已经缓存了另一个版本,并且从未尝试重新获取该crossorigin版本(即使我crossorigin在显示的图像上使用它.

要修复,我添加?crossorigin到图像的末尾url(但你可以添加?blah,它只是任意改变缓存状态)当我加载它为画布..让我知道如果你找到一个更好的修复Chrome

  • 缓存也证明了我的问题(在我尝试了接受的答案之后).谢谢你. (5认同)
  • 感谢您的回答!我在 Chrome 上遇到了同样的问题,但没有找到答案。 (2认同)
  • 如果 CORS 出现问题,所有人都需要尝试这个!拯救我的一天! (2认同)

Mik*_*iLL 18

我只是添加到这个答案 -上面 - 这解决了我的问题.

要将AWS/CloudFront分发点设置为转发CORS Origin Header,请单击分发点的编辑界面:

在此输入图像描述

转到行为选项卡并编辑行为,将白名单标题从无更改为白名单,然后确保Origin添加到列入白名单的框中.

在此输入图像描述


Ton*_*nio 13

就像其他人所说的那样,您首先需要在 S3 存储桶中进行 CORS 配置:

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

但是在我这样做之后,它仍然无法正常工作。我正在使用 Chrome(可能与其他浏览器存在相同的问题)。

问题是Chrome 正在缓存带有标头(不包含 CORS 数据)的图像,所以无论我尝试在 AWS 中更改什么,我都不会看到我的 CORS 标头。

之后清除浏览器缓存和重新载入页面,图像具有预期的CORS头

  • 谢谢!这个缓存问题让我发疯。对于想知道如何在 Chrome(版本 73)上轻松清除缓存的任何人,请右键单击重新加载按钮并选择“清空缓存和硬重新加载”。然后,您将在 &lt; 5 秒内看到您对 S3 CORS 所做的任何更改的效果。(也许更快 - 这就是我切换浏览器标签所需的时间。) (2认同)
  • 这是我的问题。我的存储桶具有适当的 CORS 配置,我的浏览器非常高效,谢谢。 (2认同)

veu*_*ent 10

我在将3D模型从S3加载到javascript 3D查看器(3D HOP)时遇到了类似的问题,但奇怪的是只有某些文件类型(.nxs).

什么固定它,我正在改变AllowedHeader从默认Authorization*在CORS配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

  • 2017年10月需要设置`<AllowedHeader>*</ AllowedHeader>`就像这样用Chrome的星号.非常感谢你!(另外,请不要忘记在设置后清除浏览器缓存). (3认同)

Dee*_*pak 6

我尝试了上面的所有答案,但没有任何效果。实际上,我们需要将上述答案的 3 个步骤结合起来才能使其工作:

  1. 正如弗拉维奥所建议的那样;在您的存储桶上添加 CORS 配置:

    <CORSConfiguration>
       <CORSRule>
         <AllowedOrigin>*</AllowedOrigin>
         <AllowedMethod>GET</AllowedMethod>
       </CORSRule>
     </CORSConfiguration>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在图像上;提到跨域:

    <img href="abc.jpg" crossorigin="anonymous">
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你在使用 CDN 吗?如果一切正常,连接到源服务器但不是通过 CDN;这意味着您需要在 CDN 上进行一些设置,例如接受 CORS 标头。确切设置取决于您使用的 CDN。


Cha*_*aye 6

我到达了这个线程,结果证明上述解决方案都不适用于我的案例。事实证明,我只需要从<AllowedOrigin>存储桶 CORS 配置中URL删除尾部斜杠

失败:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://www.mywebsite.com/</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

获胜:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://www.mywebsite.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

我希望这可以节省一些人的头发。


小智 5

首先,激活 S3 存储桶中的 CORS。使用此代码作为指导:

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example1.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>http://www.example2.com</AllowedOrigin>

   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedMethod>DELETE</AllowedMethod>

   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

2)如果它仍然不起作用,请确保还在您的 img 标签中添加带有“*”值的“crossorigin”。将其放入您的 html 文件中:

  let imagenes = document.getElementsByTagName("img");
    for (let i = 0; i < imagenes.length; i++) {
      imagenes[i].setAttribute("crossorigin", "*");
Run Code Online (Sandbox Code Playgroud)


Pre*_*han 5

更新 CORS 配置后,还请清理浏览器缓存。我的在使用 Strapi 时清理缓存后工作正常


Aur*_*yan 5

我最近遇到了同样的问题,AWS 似乎对我们定义 CORS 配置的方式做了一些更改。例如,如果您过去想要在 S3 存储桶上允许某些方法,则必须在编辑器上执行以下操作:

下面的配置与上面的配置等效,但采用数组的形式。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "HEAD",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]
Run Code Online (Sandbox Code Playgroud)