我有一个正在等待img标记的加载或错误事件的函数。有时,我得到一个错误事件,img标签的naturalWidth和naturalHeight都等于零。奇怪的是,查看chrome的开发人员工具中的网络选项卡,图像请求的状态代码为302,重定向请求返回正常,状态为200。 (实际图像存储在S3上,但我们的服务器重定向到那里)。
此外有问题实际显示,但不正确,因为我使用naturalWidth和naturalHeight来计算图像的一些CSS属性。
我还收到错误消息“跨源资源共享策略拒绝跨域图像加载”。我不确定这是否相关,或者它是否指的是相同的图像。
我特别困惑,因为它只发生在一系列的第一张图片中,有时只会发生。
有谁知道发生了什么,或者至少知道导致错误事件的原因是什么?
更新:
S3存储桶和服务器重定向都配置为支持CORS。但是,似乎只要发生这种情况,浏览器就会使用没有Access-Control-Allow-Origin标头的缓存图像。我相信正在发生的事情是,在应用程序的早期我们请求图像而不使用CORS,因此没有头文件,那么此时我们使用CORS,但是我们遇到了一个没有用CORS检索的缓存版本。我仍然不知道如何解决这个问题。我并不是100%确定这是发生了什么,虽然我很确定它与缓存和跨源请求有关。
我仍然对为什么我同时获取同一img标记的错误和加载事件感到困惑,并且图像实际显示。此外,即使调用了load事件处理程序,this.complete也是false,this.naturalWidth和this.naturalHeight为零。
答案 0 :(得分:0)
CORS是一种允许网站向另一个单独域发出请求的技术。在您的情况下,这是从您的Web服务器到亚马逊S3服务器。您需要允许来自您域的请求才能访问您的S3资源。
我相信您会在此处找到所需的信息:http://aws.typepad.com/aws/2012/08/amazon-s3-cross-origin-resource-sharing.html
希望它有所帮助!
答案 1 :(得分:0)
从HTTP响应代码的W3C规范:
10.3.3 302找到了
请求的资源暂时驻留在不同的URI下。由于重定向有时可能会被更改,因此客户端应该继续使用Request-URI来处理将来的请求。如果由Cache-Control或Expires标头字段指示,则此响应仅可缓存。
临时URI应该由响应中的Location字段给出。除非请求方法是HEAD,否则响应的实体应该包含一个带有指向新URI的超链接的短超文本注释。
现在,这意味着302是重定向,但浏览器可能缓存新网址,并在内部将您的以下请求转换为该网址。超时后,浏览器将重试原始URL,而不在内部重定向请求。因此,错误或多或少地随机出现。
跨源策略是在更安全的浏览器(现代Chrome和许多其他浏览器)以及更安全的Javascript配置文件(如ES5)上实现的。
即使您只是想加载图片,此政策也会考虑跨域请求。以下是众多示例中的一个:exploit cross-domain image loading