从 Azure CDN 请求的字体文件被 CORS 策略阻止

Posted

技术标签:

【中文标题】从 Azure CDN 请求的字体文件被 CORS 策略阻止【英文标题】:Requested font files from Azure CDN being blocked by CORS policy 【发布时间】:2018-02-23 21:07:58 【问题描述】:

所以我有一个 Azure Web 服务和一个 Azure CDN。我的 Web 服务在 ASP.Net Core 上运行

我请求我网站的 index.html,它开始从 CDN 下载资产。除字体文件外,所有资源都已加载。

这是错误:

从源“https://CDN.azureedge.net/68.0.3/styles/ui-grid.woff”访问字体https://WebApp.azurewebsites.net' 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“https://WebApp.azurewebsites.net”。

以下是其中一个请求的样子:

所以我的理解是:

    从 Web 服务器下载 index.html index.html -> 从 CDN 下载 .css .css -> 从 CDN 下载字体 被阻止??似乎浏览器阻止了请求,而不是 CDN,对吗?如果是,为什么?就因为它是一个字体文件请求?

【问题讨论】:

您阅读了吗:***.com/questions/33197751/… 或 ***.com/questions/25577981/… ? 看起来这些是针对 Amazon Simple Storage Service 的,我认为我无法访问 .htaccess,还是 Web 服务器文件不是 cdn 服务器文件? 【参考方案1】:

如果使用 Azure Blob 存储作为 CDN 端点的源,问题可能是 存储帐户 中的 CORS 配置。

我最初将所有域放在Allowed Origins 下的单独行中,并收到与 OP 相同的错误。 事实证明,您可以/必须将所有域(应该具有相同的 CORS 配置)放在同一行,用 , 分隔,如下所示:

【讨论】:

该字符串的长度是否有限制? 为了让它工作,我们还必须在标准规则引擎中创建一个规则来检查请求的 Origin 标头。 docs.microsoft.com/en-us/azure/cdn/cdn-cors【参考方案2】:

在我的情况下,IIS 会阻止 .woff,因为未设置 mimeType,因此您可以在 web.config(如果需要,还可以选择 CORS)中设置它,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
    </httpProtocol>
   <staticContent>
        <remove fileExtension=".woff" /> <!-- In case IIS already has this mime type -->
        <mimeMap fileExtension=".woff" mimeType="application/x-font-woff" />
        <remove fileExtension=".woff2" />
        <!-- In case IIS already has this mime type -->
        <mimeMap fileExtension=".woff2" mimeType="application/x-font-woff2" />    
    </staticContent>
  </system.webServer>
</configuration>

【讨论】:

【参考方案3】:

如果没有正确的配置,您无法从 CDN 中提取字体 - 它是不同的域,因此浏览器无法信任没有正确标题的文件。

您只有一个选择 - 在 CDN 中正确设置标头。如果您可以访问 Apache 或 nginx,您可以设置:

阿帕奇

<FilesMatch ".(eot|ttf|otf|woff)">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

NGINX

if ($filename ~* ^.*?\.(eot)|(ttf)|(woff)$)
    add_header Access-Control-Allow-Origin *;

如果您无权访问服务器设置,则无法使用 CDN 中的字体。

【讨论】:

【参考方案4】:

如果您使用 Azure CDN 的 Verizon Premium SKU,您还可以通过 CDN 而不是源服务器设置 CORS 标头。

https://docs.microsoft.com/en-us/azure/cdn/cdn-cors

【讨论】:

以上是关于从 Azure CDN 请求的字体文件被 CORS 策略阻止的主要内容,如果未能解决你的问题,请参考以下文章

字体无法从 CDN 工作 - CORS 已设置

我在 Azure、CORS 和 WOFF 地狱

如何防止 Chrome/FF 由于 CORS 策略而阻止 CDN 字体?

Azure 存储。得到 403 [url](未启用 CORS 或未找到此请求的匹配规则。)

Azure CDN 中的详细访问日志

Azure API管理:原始标头丢失或为空,并且该请求被分类为非跨域。未应用CORS政策