【问题标题】:Why Does IIS CORS Module 'Access-Control-Allow-Origin' Appear To Be Cached?为什么 IIS CORS 模块“访问控制允许来源”似乎被缓存?
【发布时间】: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.comhttps://www.second_domain.com 都将被屏蔽。就好像第一次有人访问时,Access-Control-Allow-Origin 标头值会在图像服务器上单独缓存四分钟,然后为此后请求访问的所有域返回相同的值,直到缓存过期。

【问题讨论】:

    标签: iis caching header cors


    【解决方案1】:

    您可以通过 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 是关键元素(用分号分隔多个标头名称。)某些操作(即身份验证)不能很好地与内核模式缓存混合使用,因此如果所有其他操作都失败,请尝试仅禁用内核模式。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        变化:原产地

        请参阅以下参考资料:

        【讨论】:

          猜你喜欢
          • 2019-12-18
          • 2019-02-09
          • 2016-06-02
          • 2021-09-07
          • 2016-06-27
          • 2016-12-10
          • 1970-01-01
          • 1970-01-01
          • 2018-11-08
          相关资源
          最近更新 更多