【发布时间】:2018-05-18 19:08:42
【问题描述】:
我们正在尝试从 JavaScript 访问跨域图像文件:
var testImage = var Image;
testImage.crossOrigin = 'anonymous';
testImage.src = 'https://cdn.example.com/testImage.png';
在浏览器中(Chrome,但我们可以在其他浏览器上看到行为,也可以直接通过 curl)显示来自三个不同域的相同网页内容。图像服务器正在运行 IIS,并安装了具有以下配置的 CORS 模块:
<cors enable="true" failUnlistedOrigins="true">
<add origin="https://www.first_domain.com" allowed="true">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
<add origin="https://www.second_domain.com" allowed="true">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
<add origin="https://www.third_domain.com" allowed="true">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
</cors>
访问是被阻止还是被授予取决于访问的时间和顺序。例如,如果我们从https://www.first_domain.com 访问图像,则 Access-Control-Allow-Origin 标头值将为“https://www.first_domain.com”并授予访问权限,但随后尝试从其他两个允许的来源中的任何一个访问图像还将导致 Access-Control-Allow-Origin 标头值返回为“https://www.first_domain.com”,因此将不授予访问权限。
如果我们等待四分钟或更长时间,然后尝试从 https://www.second_domain.com 访问图像,则 Access-Control-Allow-Origin 标头值将返回为“https://www.second_domain.com”并授予访问权限。但是,之后尝试从 https://www.first_domain.com 访问图像也会导致 Access-Control-Allow-Origin 标头值返回为“https://www.second_domain.com”,并且访问将被阻止。
再等四分钟,https://www.third_domain.com(到目前为止一直被屏蔽)将被授予访问权限,https://www.first_domain.com 和 https://www.second_domain.com 都将被屏蔽。就好像第一次有人访问时,Access-Control-Allow-Origin 标头值会在图像服务器上单独缓存四分钟,然后为此后请求访问的所有域返回相同的值,直到缓存过期。
【问题讨论】: