有人设法在响应头中添加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响应头。
见以上答案。(但我也有一个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到图像url的末尾(但你可以添加?blah,这只是随意改变缓存状态),当我为画布加载它。让我知道,如果你找到一个更好的修复CHROME
这是一种简单的工作方法。
我知道这是一个老问题,但仍然很难找到解决办法。
首先,我用Rails 4、Paperclip 4、CamanJS、Heroku和AWS S3构建了一个项目。
你必须使用crossorigin: "anonymous"参数请求你的图像。
<img href="your-remote-image.jpg" crossorigin="anonymous">
Add your site URL to CORS in AWS S3. Here is a refference from Amazon about that. Pretty much, just go to your bucket, and then select "Properties" from the tabs on the right, open "Permissions tab and then, click on "Edit CORS Configuration".
Originally, I had < AllowedOrigin> set to *. Just change that asterisk to your URL, be sure to include options like http:// and https:// in separate lines. I was expecting that the asterisk accepts "All", but apparently we have to be more specific than that.
对我来说是这样的。
我想到了这个问题,上面的解决方案都不适用于我的情况。结果是,我只需要从我的桶的CORS配置中的<AllowedOrigin> 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>
我希望这能帮你省下不少麻烦。
就像其他人说的,你首先需要在你的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头。
在清除Chrome缓存和重新加载页面后,图像有预期的CORS头
警告-黑客攻击。
如果您使用S3Image来显示图像,然后尝试通过获取获取图像,可能是将其插入到PDF中或进行其他处理,请注意Chrome将缓存不需要CORS preflight请求的第一个结果,然后尝试在没有preflight 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问题现已解决。多么痛苦啊!
首先,激活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", "*");
上面的大部分答案都没用。我试图上传图像到S3桶使用react-s3,我得到了这个
跨地域请求被阻止
错误。
您所要做的就是在s3 Bucket中添加CORS配置
进入“S3桶->权限-> CORS配置”
然后粘贴下面的内容
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>
将*替换为您的网站url。
参考:AWS CORS设置
在我的例子中,我用下面的配置来解决它
首先,进入权限,然后进入跨源资源共享(CORS)
然后点击编辑并粘贴下面的代码…
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"http://www.example1.com"
],
"ExposeHeaders": []
},
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"PUT",
"POST",
"DELETE"
],
"AllowedOrigins": [
"http://www.example2.com"
],
"ExposeHeaders": []
},
{
"AllowedHeaders": [],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
点击这里了解更多信息
我最近遇到了同样的问题,似乎AWS对我们定义CORS配置的方式做了一些更改。例如,如果你想允许某些方法在过去的S3桶上,你必须在编辑器上做这样的事情:
下面的配置与上面的配置相同,但采用数组的形式。
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"HEAD",
"DELETE"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]