在IIS上为字体文件启用CORS

16
有没有办法在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 头添加到响应中...就像这样:http://tpeczek.blogspot.com/2010/09/httphandler-with-cross-origin-resource.html - Hackerman
我遇到的问题是我无法控制请求或响应。另一个域上的站点使用绝对路径引用我的站点上的CSS。CSS可以正常加载,但是在CSS文件中引用的位于我的服务器上的字体被阻止了。我看不到捕获此响应的方法。 - Kyle Plunkett
3个回答

35

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

我不确定我做错了什么。我得到了 HTTP 错误 500.52 - URL 重写模块错误。配置错误:_无法添加类型为“rule”的重复集合条目,其唯一键属性“name”设置为“Enable CORS for Fonts”_。 - MeSo2

20

您应该将这段代码添加到您的Web.config文件中:

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

3
不错,无需额外模块,运行得很好,顺便提一下,“<location>”标签应该在“<configuration>”标签下面。 - Joseph Pernerstorfer
1
这很好,而且不会增加额外的重写开销。 - Gruffputs
这很好,如果您想允许任何域名访问。但是对于多个特定域名不起作用。 - CodeHacker

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

enter image description here

然后在您的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 Rewrite模块是一个非常有用的工具,我以前不知道它。 - Kyle Plunkett
我很高兴能帮助你,Kyle! - Hackerman
1
提醒:你的正则表达式匹配了文件扩展名后面的所有内容(例如:a/b/c/font.ttf.zip 也会被匹配)。应该改为 .*\.(ttf|otf|eot|woff|woff2|svg)$ - Derek Hunziker
嗨,我在很多地方看到了这个解决方案,但它对我不起作用。似乎有一些头信息从响应中被剥离了...即使使用“customHeaders”,它也不起作用,无论我添加什么头信息,你有什么线索吗?即使在Application_BeginRequest()中,我也感到迷茫:( - chrilith
1
应该使用Derek在下面的答案。需要在<rewrite>节点下使用<outboundRules>。 - Adam C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接