如何通过 CORS 策略加载字体?

Posted

技术标签:

【中文标题】如何通过 CORS 策略加载字体?【英文标题】:How to get through CORS policy to load fonts? 【发布时间】:2017-03-18 10:51:14 【问题描述】:

要访问我的字体,我使用@font-face。

@font-face 
    font-family: 'Brandon Grotesque Regular';
    src: url('http://server/font/brandon_reg-webfont.eot');
    src: url('http://server/font/brandon_reg-webfont.eot?#iefix') format('embedded-opentype'),
         url('http://server/font/brandon_reg-webfont.woff2') format('woff2'),
         url('http://server/font/brandon_reg-webfont.woff') format('woff'),
         url('http://server/font/brandon_reg-webfont.ttf') format('truetype'),
         url('http://server/font/brandon_reg-webfont.svg#brandon_grotesque_regularRg') format('svg');
    font-weight: normal;
    font-style: normal;

很遗憾,我无法访问我的字体,我的请求已被 CORS 政策阻止。

在以下位置访问字体 'http://server/font/brandon_blk-webfont.woff2' 来自原点“http://server.fr”已被 CORS 策略阻止: 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:8888” 访问。

所以我编辑了一个 .htaccess

AddType application/vnd.ms-fontobject .eot
AddType font/ .ttf
AddType font/ .eot
AddType font/ .otf
AddType font/ .woff
AddType font/ .woff2
<FilesMatch ".(ttf|otf|eot|woff|woff2)">
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>

它也没有工作。有什么想法吗?

【问题讨论】:

一些事情:现在是 2016 年,不要再使用“加载每种格式的 webfont”方法了,it's not necessary。其次,为什么要检查mod_headers.c?你知道你的服务器设置:Header set 如果你有 mod_headers 就可以工作,所以如果它不工作,你确定你没有在 apache conf 中禁用 mod_headers 吗?第 1 步是删除除 WOFF 之外的所有内容,简化您的 FilesMatch,并删除 IfModule。然后看看会发生什么。 你是对的,我的 mode_headers 被禁用了。 【参考方案1】:

这是解决方案:

<FilesMatch ".(otf|ttf|eot|woff|woff2)$">
SetEnvIf Origin "^http(s)?://(.+.)?(localhost|yourdomain.com)$" origin_is=$0
Header set Access-Control-Allow-Origin %origin_ise env=origin_is
</FilesMatch>

将其放入服务器上的 .htaccess 文件中,其中放置字体

【讨论】:

你能解释一下每一行的作用吗? %origin_ise 中的“e”是故意的吗?

以上是关于如何通过 CORS 策略加载字体?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将 CORS(跨域策略)添加到 NGINX 中的所有域?

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

Cloudfront CORS 阻止字体

使用 Google 字体的 Chrome 上的 CORS 错误

如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?