为什么 IIS CORS 模块'Access-Control-Allow-Origin'显示为缓存?



我们正尝试从 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 标头值时,它会在图像服务器上单独缓存四分钟,然后为所有请求访问的域返回相同的值,直到缓存过期。

可以使用 IIS中的缓存规则通过 IIS 管理器(通过输出缓存功能(或直接在 web.config 中忽略/排除特定扩展的特定标头。 你最终会得到一个缓存配置,有点像:

<caching enabled="true" enableKernelCache="true">
<profiles>
<add extension=".png" policy="CacheUntilChange" kernelCachePolicy="CacheUntilChange" varyByHeaders="Access-Control-Allow-Origin" />
</profiles>
</caching>

显然,您可以将策略设置为您喜欢的任何无效;varyByHeaders是关键元素(用分号分隔多个标头名称(。 某些操作(即身份验证(不能很好地与内核模式缓存混合,因此如果所有其他操作都失败,请尝试仅禁用内核模式。

我已经能够通过禁用web.config中的缓存来解决此问题:

<configuration>
<sytem.webServer>
<caching enabled="false" enableKernelCache="false" />
...
</system.webServer>
</configuration>

不过,仍在寻找更好的解决方案。

使用 CORS 时,还应设置以下标头以避免缓存问题:

变化:产地

请参阅以下参考资料:

  • 变化:源响应标头和 CORS 利用
  • CORS和Vary(英语:Cors(和Vary

相关内容

最新更新