代码之家  ›  专栏  ›  技术社区  ›  Mark A. Durham

为什么IIS CORS模块“访问控制允许源代码”似乎被缓存?

  •  2
  • Mark A. Durham  · 技术社区  · 7 年前

    我们正在尝试从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 ,访问控制允许源标题值将为' https://www.first_domain.com '并授予访问权限,但随后尝试从其他两个允许的来源中的任何一个访问图像也会导致访问控制允许来源标题值返回为' 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头的值在图像服务器上被单独缓存了四分钟,之后,所有请求访问的域都会返回相同的值,直到缓存过期。

    3 回复  |  直到 5 年前
        1
  •  2
  •   Stephen Rauch Afsar Ali    7 年前

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

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

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

        2
  •  1
  •   Mark A. Durham    7 年前

    通过禁用web中的缓存,我已经能够解决这个问题。配置:

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

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

        3
  •  1
  •   Tore Nestenius    4 年前

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

    变化:起源

    参见以下参考资料: