为什么IIS CORS模块';访问控制允许原点';似乎被缓存了?

为什么IIS CORS模块';访问控制允许原点';似乎被缓存了?,iis,caching,header,cors,Iis,Caching,Header,Cors,我们正在尝试从JavaScript访问跨源图像文件: var testImage = var Image; testImage.crossOrigin = 'anonymous'; testImage.src = 'https://cdn.example.com/testImage.png'; 在一个浏览器中(Chrome,但我们可以在其他浏览器上看到这种行为,也可以通过curl直接看到),显示来自三个不同域的相同网页内容。映像服务器正在运行IIS,并且安装了具有以下配置的CORS模块: &l

我们正在尝试从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>

,访问控制允许源标题值将为“”,并授予访问权限,但随后尝试从其他两个允许的源中的任何一个访问映像也将导致访问控制允许源标题值返回为“”,因此将不授予访问权限

如果我们等待四分钟或更长时间,然后尝试从中访问映像,则访问控制允许源标题值将返回为“”,并将授予访问权限。但是,尝试从后面访问映像也将导致访问控制允许源标题值返回为“”,访问将被阻止


再等四分钟,(到目前为止一直被屏蔽)将被授予访问权限,并且两者都将被屏蔽。这就好像有人第一次访问Access Control Allow Origin标头时,它在映像服务器上被单独缓存了四分钟,然后,在缓存过期之前,所有请求访问的域都会返回相同的值。

我可以通过在web.config中禁用缓存来解决此问题:

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

...

仍然在寻找更好的解决方案。

您可以通过IIS管理器(通过输出缓存功能)或直接在web.config中使用IIS中的缓存规则忽略/排除特定扩展的特定头。您将得到一个类似以下内容的缓存配置:

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


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

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

变化:起源

见以下参考资料: