S3-访问控制允许来源标头


187

是否有人设法添加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" />

此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>

如您所料,没有Origin响应头。



1
缺少的一件事是:<ExposeHeader> Access-Control-Allow-Origin </ ExposeHeader>
Dimitry

Answers:


197

通常,您需要做的就是在存储桶属性中“添加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> 

有关更多信息,您可以阅读有关编辑存储桶权限的本文。


4
似乎有可能。尝试阅读上面的链接(在答案中)或直接转到此链接:docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTcors.html
Flavio Wuensche 2014年

7
谢谢。只需单击“保存”,即可加载我的字体。
塔尼亚·拉斯西亚

2
我注意到它有时可以工作,有时我在编辑此命令后仍然出现浏览器错误。不确定是CloudFlare还是S3。
2016年

4
您可能需要添加HEADAllowedMethods
jordanstephens

31
对我不起作用。HEAD或GET请求的响应中仍然没有“ Access-Control-Allow-Origin”标头。
carpiediem

104

我在加载Web字体时遇到了类似的问题,当我单击存储桶属性中的“添加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> 

我只是单击“保存”,然后开始工作,我的自定义Web字体正在IE和Firefox中加载。我不是这方面的专家,我只是认为这可能会对您有所帮助。


12
谢谢!这为我做到了。我可以单击“添加CORS配置”,但没有意识到必须单击“保存”,因为我以为自己正在查看默认配置。天啊
Jack Cushman 2014年

35
我必须设置<AllowedHeader>*</AllowedHeader>它才能正常工作(最好仅在执行此操作时才为您的网站制定新规则)
议会

4
@parliament具有神奇的作用,因为直到<AllowedHeader>设置为通配符,上述所有其他设置才有效。欢呼。
Neal Magee'3

我进入了CORS设置,并在其中找到了相同的设置,但是当我单击保存时,<AllowedOrigin> * </ AllowedOrigin>变为活动状态。以前没有。
dvdmn

1
就是这样,点击保存
lapinkoira

48

如果您的请求未指定Origin标头,则S3不会在响应中包含CORS标头。这真的让我感到震惊,因为我一直在尝试对文件进行卷曲以测试CORS,但curl不包括在内Origin


2
自2周以来我一直在互联网上搜寻,所有的文章和答案都在谈论改变他们所说的S3 CORS配置,但是响应没有改变,直到我看到您的答案对我有意义,我使用邮递员及其工作!非常感谢您
Abdallah Awwad Alkhwaldah

1
谁知道我该如何更改img标签的标题?我无法发送不同的标头,浏览器发送请求
IDan

1
OMG它记录在任何地方?
Darkowic

2
它是:) docs.aws.amazon.com/AmazonS3/latest/dev/… >验证请求是否具有Origin标头。如果标头丢失,Amazon S3不会将请求视为跨源请求,并且不会在响应中发送CORS响应标头。
Darkowic

46

@jordanstephens在评论中说了这一点,但它有点迷路,对我来说真的很容易解决。

我只是添加了HEAD方法,然后单击保存,它开始起作用。

<CORSConfiguration>
	<CORSRule>
		<AllowedOrigin>*</AllowedOrigin>
		<AllowedMethod>GET</AllowedMethod>
		<AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
		<MaxAgeSeconds>3000</MaxAgeSeconds>
		<AllowedHeader>Authorization</AllowedHeader>
	</CORSRule>
</CORSConfiguration>


3
自2018年1月17日起生效,接受的答案令人遗憾。大声笑
lasec0203

4
是的 当从AWS S3获取诸如字体之类的东西时,这修复了Chrome中的“无'Access-Control-Allow-Origin'标头”错误。
Nostalg.io

1
是! 非常感谢。允许HEAD方法起到了作用。
扎克

37

这是完成这项工作的简单方法。

我知道这是一个古老的问题,但仍然很难找到解决方案。

首先,这对我来说是一个使用Rails 4,Paperclip 4,CamanJS,Heroku和AWS S3构建的项目。


您必须使用crossorigin: "anonymous"参数来请求图像。

    <img href="your-remote-image.jpg" crossorigin="anonymous"> 

将您的站点URL添加到AWS S3中的CORS。是亚马逊对此的参考。差不多,只需转到您的存储桶,然后从右侧的选项卡中选择“ 属性 ”,打开“ 权限”选项卡,然后单击“ 编辑CORS配置 ”。

最初,我已经< AllowedOrigin>设置为*。只需将星号更改为您的URL,请确保在单独的行中包含http://和这样的选项https://。我期望星号接受“全部”,但是显然我们必须比这更具体。

这就是我的样子。

在此处输入图片说明


1
与接受的答案不同,这实际上有效!甚至装载此S3的ClaudFront CDN都在复制这些标头。谢谢老兄,救了我几个小时!
相当于

5
如果您使用的是CloudFront,则可能还需要查看一下-blog.celingest.com/en/2014/10/02/…–
Kunal

1
感谢@Kunal的链接。CloudFront为该方程式增加了一层复杂性。
Tyler Collier

1
我已经了解了MDN文档<img>,但我只是crossOrigin="true"错误地提出了。谢谢!
Cezille07年7

哇,这实际上对我有用!我可以在本地主机上使用它,甚至可以使用星号,关键是将crossorigin =“ anonymous”添加到我的html元素中:D
亚历山大

23

请参阅以上答案。(但是我也有一个chrome bug)

不要在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

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

为了修复,我?crossorigin在图像url的末尾添加了一个(但您可以添加?blah,更改缓存状态是任意的),当我将其加载到画布时。


5
缓存也被证明是我的问题(在尝试了可接受的答案之后)。谢谢你
FearMediocrity's

在Chrome上也存在缓存问题。轻松解决:工具/设置>清除浏览数据...>缓存的图像和文件尽管可能会遇到此问题的用户可能需要另一种解决方案。
StevieP

1
感谢您的回答!我在Chrome浏览器中遇到了同样的问题,但没有找到答案。
Wandrille

1
如果CORS有问题,所有人都需要尝试!!拯救我的一天!
Sangar82

23

我只是在上面添加了此答案,从而解决了我的问题。

要将AWS / CloudFront分发点设置为偏向CORS原始标头,请单击进入分发点的编辑界面:

在此处输入图片说明

转到行为选项卡并编辑行为,将“基于选定请求标头的缓存”从“无”更改为“白名单”,然后确保Origin将其添加到白名单框中。有关更多信息,请参阅在AWS Docs中将CloudFront配置为尊重CORS设置

在此处输入图片说明


您必须设置哪些允许的HTTP方法?
学习者

您是说像GET,POST,DELETE等...?在哪里要求这些?
MikeiLL

您能否重新表达您的问题,以便我理解您是指cf Web表单还是要求s3资源的应用程序?如果是前者,则此处的docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…中
Learner

似乎您在询问HTTP Request Methods必须在AWS中设置什么。关于这个问题,我认为不需要在任何地方设置它。如果您在请求资源的应用程序中谈论内容,我相信您只是按以下方式请求文件url string:即图像,视频,音频文件。
MikeiLL

那是丢失的一块!谢谢!我尝试了所有以上答案,只有将这些标头列入白名单后,它才能在localhost上为我工作
Omer Leshem

11

我在将S3的3D模型加载到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>

3
需要<AllowedHeader>*</AllowedHeader>在2017年10月为Chrome 设置一个这样的星号。非常感谢!(此外,设置后不要忘记清除浏览器缓存)。
Nostalg.io

小点-我认为您不需要更改AllowedHeader。我在这里也遇到了同样的问题,但事实证明,这是浏览器在缓存先前的响应(MaxAgeSeconds)。在“ DevTools设置”中,您可以在控制台打开时忽略缓存。完成后,它开始为我工作
divillysausages

AllowedHeader> * <绝对为我解决了此问题。它可能仅在通过特定的xhr库发送请求时才适用?我正在使用Axios,并发现有必要。
杰里米

6

与其他状态一样,您首先需要在S3存储桶中具有CORS配置:

<CORSConfiguration>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod> <!-- Add this -->
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

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

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

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


1
谢谢!这个缓存问题使我发疯。对于想知道如何在Chrome(版本73)上轻松清除缓存的人,请右键单击重新加载按钮,然后选择“清空缓存并进行硬加载”。然后,您会在不到5秒的时间内看到对S3 CORS所做的任何更改的效果。(也许更快-这是它只是需要多长时间我切换浏览器标签)
thund

1
这是我的问题。我的存储桶具有适当的CORS配置,我的浏览器非常高效,非常感谢🤪谢谢。
丹尼尔·布雷迪

5

我尝试了以上所有答案,但没有任何效果。实际上,我们需要从上述答案中分三个步骤来使其起作用:

  1. 如Flavio所建议;在您的存储桶中添加CORS配置:

    <CORSConfiguration>
       <CORSRule>
         <AllowedOrigin>*</AllowedOrigin>
         <AllowedMethod>GET</AllowedMethod>
       </CORSRule>
     </CORSConfiguration>
    
  2. 在图像上;提及跨源:

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


感谢CDN部分非常重要,您能否添加CDN级别所需内容的详细信息?
svelandiag

5

我到达此线程,以上解决方案均未应用于我的情况。事实证明,我只需要从<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>

获胜:

<?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>

我希望这可以节省一些人的时间。


3
  1. 在S3存储桶的“权限”设置中设置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>Authorization</AllowedHeader>
        </CORSRule>
    </CORSConfiguration> 
    
  2. 仅当http请求具有标头时,S3才添加CORS标Origin头。

  3. CloudFront 默认情况下转发Origin标头

    您需要Origin在“行为”设置中将CloudFront分布的标头列入白名单。


2

我通过编写以下代码修复了问题:

<?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>

为什么<AllowedHeader>*</AllowedHeader>不工作<AllowedHeader>Authorization</AllowedHeader>


1

fwuensche“ answer”是建立CDN的秘诀;为此,我删除了MaxAgeSeconds。

<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>

1

在最新的S3管理控制台中,当您单击“权限”选项卡上的CORS配置时,它将显示默认的示例CORS配置。但是,此配置实际上并未激活!您必须先单击保存才能激活CORS。

我花了很长时间才弄清楚这一点,希望这可以节省一些时间。


1

此配置为我解决了这个问题:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我发现此配置与该问题中许多其他答案的配置之间几乎没有区别。发布此配置之前是否尝试使用较早答案的配置?
entpnerd

1

警告-骇客。

如果您使用S3Image来显示图像,然后尝试通过获取来获取图像,或者将其插入PDF或进行其他处理,请注意Chrome将缓存不需要CORS预检请求的第一个结果,并且然后尝试在没有预检OPTIONS请求的情况下获取相同的资源,并且由于浏览器的限制而失败。

解决此问题的另一种方法是,确保S3Image包含交叉源:如上所述的“ use-credentials”。在使用S3Image的文件中(我有一个创建S3Image缓存版本的组件,因此这对我来说是个完美的地方),重写S3Image的原型imageEl方法以强制其包含此属性。

S3Image.prototype.imageEl = function (src, theme) {
    if (!src) {
        return null;
    }
    var selected = this.props.selected;
    var containerStyle = { position: 'relative' };
    return (React.createElement("div", { style: containerStyle, onClick: this.handleClick },
        React.createElement("img", { crossOrigin: 'use-credentials', style: theme.photoImg, src: src, onLoad: this.handleOnLoad, onError: this.handleOnError}),
        React.createElement("div", { style: selected ? theme.overlaySelected : theme.overlay })));
};

403问题现在已解决。真是痛苦啊!


1
<AllowedOrigin>*</AllowedOrigin>

这不是一个好主意,因为使用*授予任何网站访问存储桶中文件的权限。相反,您应该指定完全允许哪个来源使用存储桶中的资源。通常,这是您的域名,例如

<AllowedOrigin>https://www.example.com</AllowedOrigin>

或者如果您想包括所有可能的子域:

<AllowedOrigin>*.example.com</AllowedOrigin>

1

以下是配置,对我来说很好。我希望它将有助于解决您在AWS S3上的问题。

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

首先,这对我很有用,然后我通过删除不需要的方法并仅将其指定给我想要的标
头来

0

可接受的答案有效,但似乎如果直接访问资源,则没有跨域标头。如果您使用的是Cloudfront,这将导致Cloudfront缓存不带标题的版本。当您转到另一个加载该资源的URL时,将遇到此跨域问题。


0

如果您的CORS设置没有帮助。

验证配置S3是否正确。我在中有无效的存储桶名称Storage.configure。我使用了bucket的简称,它导致了错误:

所请求的资源上没有“ Access-Control-Allow-Origin”标头。


0

首先,在您的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>

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

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

-1

对于它的价值,我遇到了类似的问题-尝试添加允许的特定来源(不是*)时。

原来我必须纠正

<AllowedOrigin>http://mydomain:3000/</AllowedOrigin>

<AllowedOrigin>http://mydomain:3000</AllowedOrigin>

(请注意URL中的最后一个slah)

希望这可以帮助某人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.