我们正在尝试从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标头值将为&#39; https://www.first_domain.com&#39;并且授予了访问权限,但是后续尝试从其他两个允许的来源中的任何一个访问图像也将导致Access-Control-Allow-Origin标头值被返回为&#39; https://www.first_domain.com&#39;因此,不将被授予访问权。
如果我们等待四分钟或更长时间然后尝试从https://www.second_domain.com访问该图像,则Access-Control-Allow-Origin标头值将返回为&#39; https://www.second_domain.com& #39;并且将获得访问权限。但是,尝试之后从https://www.first_domain.com访问图像也会导致Access-Control-Allow-Origin标头值返回为&#39; https://www.second_domain.com&#39;并且访问权限将被阻止。
再等四分钟,https://www.third_domain.com(到目前为止一直被阻止)将被授予访问权限,https://www.first_domain.com和https://www.second_domain.com都将被阻止。就好像Access-Control-Allow-Origin标头值在第一次访问它时在图像服务器上被单独缓存四分钟,然后为请求访问的所有域返回相同的值,直到缓存过期。
答案 0 :(得分:2)
您可以通过IIS管理器(通过“输出缓存”功能)或直接在web.config中使用IIS中的缓存规则来忽略/排除特定扩展名的特定标头。您将获得类似于以下的缓存配置:
<%= simple_form_for([@post, @comment]) do |f| %>
很显然,您可以将策略设置为您喜欢的任何失效方法; variableByHeaders是关键元素(用分号分隔多个标头名称。)某些操作(即身份验证)不能与内核模式缓存很好地混合使用,因此,如果其他所有操作失败,请尝试仅禁用内核模式。
答案 1 :(得分:0)
我已经能够通过在web.config中禁用缓存来解决此问题:
<configuration>
<sytem.webServer>
<caching enabled="false" enableKernelCache="false" />
...
</system.webServer>
</configuration>
仍在寻找更好的解决方案。
答案 2 :(得分:0)
当您使用 CORS 时,您还应该设置以下标头以避免缓存问题:
变化:起源
请参阅以下参考资料: