带有`crossOrigin =“匿名”`的Image标签无法从S3加载成功

时间:2018-03-27 01:45:12

标签: javascript html html5 amazon-s3

在javascript中

const image = new Image() image.crossOrigin = 'Anonymous' image.src = 'https://s3.amazonaws.com/ch-static-beta/avatar/user/1a8fdd22d5ec11e784da0e28350150f71512059569.png'

将收到错误 enter image description here

http标头是 enter image description here

但是当我使用curl并使用此请求标头时,响应将成功。像这样。enter image description here

1 个答案:

答案 0 :(得分:10)

这是一个缓存问题,and a chrome bug *:

*关闭为WONT-FIX,chrome devs表示它本身不是一个bug,它是服务器的错误配置,应该将allow origin标头发送给任何请求......相关的{{3} },也关闭为WONT-FIX。

您可能已经在不请求CORS标头的情况下向此图像发出过请求。

当您执行第二个请求时,浏览器错误地重用缓存的响应。

var rand = '?'+Math.random();
var no_cors = new Image();
no_cors.onload = loadCORS;
no_cors.src = 'https://s3.amazonaws.com/ch-static-beta/avatar/user/1a8fdd22d5ec11e784da0e28350150f71512059569.png' + rand;


function loadCORS(){
  var with_cors = new Image();
  with_cors.crossOrigin = 'anonymous';
  with_cors.src = no_cors.src;
  with_cors.onload = function(){console.log('loaded');};
  with_cors.onerror = function(){console.error('failed');};
}

因此,对于修复:[...] 配置S3,使其始终发送跨源标头。 *
要解决此问题,请始终加载crossOrigin版本 对于临时修复,请禁用缓存。

*似乎无法设置S3来执行此操作,请参阅bug report this excellent answer,这也提供了其他服务器端解决方法。