【问题标题】:Enabling CORS on IIS for only Font files在 IIS 上仅为字体文件启用 CORS
【发布时间】:2017-01-31 13:04:01
【问题描述】:

有没有办法在 IIS7 上仅为特定类型的文件启用 CORS?我将关闭这篇文章 (https://www.maxcdn.com/one/tutorial/how-to-use-cdn-with-webfonts/) 并注意到 Apache 和 nginx 示例显示只有在请求正在寻找某个 Content-Type 时才启用 CORS,而 IIS 示例显示所有内容都启用了 CORS。

我有在外部站点上引用的 CSS,但字体文件被浏览器阻止,并希望在 IIS7 上启用 CORS,但仅适用于 .woff、.woff2、.tff、.eot 和 .svg 文件.如果可能,我不希望为所有内容启用 CORS。

【问题讨论】:

  • 您可以为这些特定文件实现和 HttpHandler 并将 CORS 标头添加到响应中......像这样:tpeczek.blogspot.com/2010/09/…
  • 我的问题是我无法控制请求或响应。来自我网站的 CSS 正在使用我网站的绝对路径在不同域上的另一个网站上被引用。 CSS 很好,但驻留在我服务器上的 CSS 文件中引用的字体被阻止。我没有看到可以从中捕获响应的方法。

标签: fonts iis-7 web-config cors


【解决方案1】:

Hackerman 的回答很棒,它让我找到了解决方案,但是,我必须做出一些调整。首先是将规则放在rewrite 节点下的outboundRules 部分。

<outboundRules>
    <rule name="Enable CORS for Fonts">
        <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
        <conditions>
          <add input="{REQUEST_URI}" pattern="^[^\?]+\.(ttf|otf|eot|woff|woff2|svg)(\?.*)?$" />
        </conditions>
        <action type="Rewrite" value="*" />
    </rule>
</outboundRules>

最后,更新了正则表达式以阻止如下请求,这将允许某人跨来源请求任何 URL:

/some/critical/javascript/file.js?v=.woff
/api/secure/users?v=.woff

...但它仍然允许以下操作

/some/font.woff
/some/font.woff?etag
/some/font.woff?v=123

【讨论】:

    【解决方案2】:

    您应该将此代码添加到您的 Web.config:

      <location path="fonts/FontName.ttf">
        <system.webServer>
           <httpProtocol>
              <customHeaders>
                 <add name="Access-Control-Allow-Origin" value="*" />
              </customHeaders>
           </httpProtocol>
        </system.webServer>
      </location>
    

    【讨论】:

    • 很好,不需要额外的模块,并且工作起来就像一个魅力,请注意&lt;location&gt; 标签应该在&lt;configuration&gt; 标签下
    • 这很好,并且不会在退出时增加额外的重写开销。
    • 如果您想允许任何域的访问,这很好。但不适用于多个特定域
    【解决方案3】:

    您可以安装 IIS 重写模块 https://www.microsoft.com/en-us/download/details.aspx?id=7435 。安装模块后,重新启动 IIS 管理器并在“站点”节点下单击您的网站。如果您在 IIS 部分右侧的窗口中看到 URL 重写模块符号(如下所示),那么您就可以开始了:

    然后在您的 Web.config 上,您需要添加以下规则:

    <rewrite>
     <rules>
      <rule name="Add Cross Origin Access">
        <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
        <conditions>
          <add input="{REQUEST_URI}" pattern="^[^\?]+\.(ttf|otf|eot|woff|woff2|svg)(\?.*)?$" />
        </conditions>
        <action type="Rewrite" value="*"/>
      </rule>
     </rules>
    </rewrite>
    

    【讨论】:

    • 这是对我有用的答案。谢谢您的帮助。 URL 重写模块是一个非常有用的工具,我以前不知道。
    • 我很高兴能帮上忙,凯尔!
    • 仅供参考 - 您的正则表达式匹配文件扩展名之后的所有内容(例如:a/b/c/font.ttf.zip 将被匹配)。应该是.*\.(ttf|otf|eot|woff|woff2|svg)$
    • 嗨,现在很多地方都看到了这个解决方案,但它对我不起作用。似乎从响应中删除了一些标题......甚至使用“customHeaders”它也不起作用,对于我添加的任何标题,有什么线索吗?即使在 Application_BeginRequest() 中,我也迷路了 :(
    • 应该在下面使用 Derek 的答案。需要在节点下使用
    猜你喜欢
    • 2021-03-14
    • 2020-10-18
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多