当使用CORS标头请求存储在AWS S3(简单存储)上的图像时,我目前遇到了问题。我在AWS控制台上设置了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>
然而,我在申请这些我存储的图像时得到的响应有点遍布并且非常间歇性。有时图像会返回,并且需要标题,有时则不会。我真的不确定为什么会这样。当我尝试在页面上将Access-Control-Allow-Origin标头设置为*时对图像进行多个请求时,效果似乎也会恶化(例如,如果我需要使用交叉原点标题检索10个图像)。
这些是我需要的标题:
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:*
Access-Control-Max-Age:3000
我真的不确定我做错了什么。我确保每个图片标记都添加了crossOrigin =“anonymous”属性,但同样没有运气。
我需要这些图像跨原点工作的原因是因为我安装了一个角度插件,允许用户裁剪图像并将图像的裁剪版本存储为base64字符串。但是,在尝试检索它们时出现以下错误。
这些是正确返回的图像的标题:
Request URL:https://trajansmarket.s3.amazonaws.com/be5bbda0-b04a-11e5-81d3-dd7ff3efeebc.jpg
Request Method:GET
Status Code:304 Not Modified
Remote Address:54.231.252.131:443
Response Headers
view source
Access-Control-Allow-Methods:GET
Access-Control-Allow-Origin:*
Access-Control-Max-Age:3000
Cache-Control:public, max-age=31536000
Date:Tue, 12 Jan 2016 21:13:03 GMT
ETag:"77bdbe9b517acc8cba86024c592bce3f"
Last-Modified:Fri, 01 Jan 2016 05:46:21 GMT
Server:AmazonS3
Vary:Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-id-2:F3OQpOHsAqySk9LNwwoJXVATVIByr4Gtvz953ZoL7DdB/dtE9nYwo99R59Rj6RzZc3dcHyk6wWY=
x-amz-request-id:CD220FF1F6EE6CA9
Request Headers
view source
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6,ms;q=0.4
Connection:keep-alive
Host:trajansmarket.s3.amazonaws.com
If-None-Match:"77bdbe9b517acc8cba86024c592bce3f"
Origin:http://91.121.220.161:3000
Referer:http://91.121.220.161:3000/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
这是一个没有标题的人:
Request URL:https://trajansmarket.s3.amazonaws.com/c0671e00-b04a-11e5-81d3-
dd7ff3efeebc.jpg
Request Method:GET
Status Code:200 OK (from cache)
Remote Address:54.231.252.135:443
Response Headers
Accept-Ranges:bytes
Cache-Control:public, max-age=31536000
Content-Length:142102
Content-Type:application/octet-stream
Date:Tue, 12 Jan 2016 00:35:36 GMT
ETag:"beb93f56e3a2a65b983addd8af35c26c"
Last-Modified:Fri, 01 Jan 2016 05:46:25 GMT
Server:AmazonS3
x-amz-id-2:5XvaOd8bxMr5zwK317DfDMbk2+kzu3Zd7rsf2xl0hxwI40Oc4KDnQpgzD3sgtCRm9SXGqa93Mh0=
x-amz-request-id:FD3EB1978C38013B
Request Headers
Provisional headers are shown
Accept:image/webp,image/*,*/*;q=0.8
Origin:http://91.121.220.161:3000
Referer:http://91.121.220.161:3000/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id:498F45FE-5D49-4AE0-AF58-F81B9AFD48AF
我只是想知道是否有人会知道为什么会发生这种情况。任何帮助将不胜感激。
答案 0 :(得分:3)
这是非常令人沮丧的,我还没有弄清楚AWS S3间歇性地返回CORS所需的标题的原因。
我已经想到了一个解决方法,即下载&#39;并将我需要的图像从亚马逊存储在本地文件夹中 - 允许用户“剪切”#39;图像并存储之前,然后从本地文件夹中删除这些图像。
要将图像文件流式传输到本地文件夹,我在s3的.getObject方法中使用了fs.createWriteStream方法。可以在以下位置找到此示例:enter link description here
这使我无需实际请求带有CORS标头的图像,因为它们在本地存储时,不再需要标头。然后我可以保存由我的cropper指令生成的base64,并将其存储在amazon S3上。
如果用户在裁剪本地图像之前导航,我会将其从本地文件夹中删除,这样就不会堵塞。
我希望这对那些也遇到CORS标题问题的人有所帮助 - 尽管它只是一种解决方法。
答案 1 :(得分:2)
我已经以多种不同的形式看到了这个问题: 一个是您在S3中为一个页面提供服务的页面,该页面访问EC2或Elastic Beanstalk中的nodejs后端。
在一个案例中,我使用IE10的浏览器因为浏览器需要设置Preflight选项而引发错误。
在其他情况下,我在S3中使用Elastic Beanstalk和Angular中的Restify。我在请求中添加了Restify-cors中间件包:
var corsMiddleWare = require('restify-cors-middleware'); //npm install this package
var cors = corsMiddleWare ({
allowHeaders:['Authorization', 'API-Token', 'API-Token-Expiry']
});
server.pre(cors.preflight);
server.use(cors.actual);
//rest of server definition
这似乎有效。 在express的情况下,有节点包express-cors:
var cors = require('cors');
app.use(cors());
在任何一种情况下,关键是所有请求必须正确设置标头,因此我们将它们添加到中间件。 (应用程序/ server.use) How can I support cors when using restify
您使用的是香草节点吗?在这种情况下,您需要在对s3发出的每个请求中添加标头。
答案 2 :(得分:0)
这绝对是一个问题,它对我来说是一个缓存的回应。它似乎丢失了缓存中的一些标头。我可以通过在图像名称中附加一个随机时间参数来让它在100%的时间内工作,如下例所示。
img = new Image();
img.src = "https://s3.amazonaws.com/bucket/img.png?t=" + (new Date().getTime() / 1000);
img.crossOrigin = "Anonymous";