字体Awesome图标未在Chrome中显示,这是一个与MaxCDN相关的跨源资源共享策略问题

g6ll5ycj  于 2022-12-06  发布在  Go
关注(0)|答案(7)|浏览(165)

我刚刚注意到几个网站上的字体真棒图标不显示在谷歌浏览器。控制台显示以下错误:
来源'http://cdn.keywest.life'的字型已被跨来源资源共用原则封锁,无法载入:请求的资源上不存在"Access-Control-Allow-Origin"标头。因此不允许访问源"http://www.keywest.life"。
我在其他几个网站上发现了完全相同的问题。这可以很容易地通过将自己的CDN引用替换为:
//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css

  • 然而,这不是解决方案,只是一个变通办法。我很想知道原因和正确的解决方案。
    (the起因是这样的:该网站使用自己的CDN,由MaxCDN提供,并引用了字体awesome字体,这些字体不是由Chrome加载的,如果您从Bootstrapcdn资源加载相同的资源(如上所述),它会工作)
    下面是这个问题的一个例子(在菜单和页脚的社交图标中:http://www.keywestnight.com/fantasy-fest)的数据
    感谢您的帮助/解释!
velaa5lx

velaa5lx1#

以下是允许从所有域访问webfonts的工作方法:

# Allow access from all domains for webfonts.
# Alternatively you could only whitelist your
# subdomains like "subdomain.example.com".
<IfModule mod_headers.c>
  <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css)$">
    Header set Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>
wd2eg0qa

wd2eg0qa2#

问题不在于CSS文件,而在于字体文件的服务方式。

@font-face{font-family:'FontAwesome';
src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');
src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0')
format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') 
format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') 
format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');
font-weight:normal;
font-style:normal}

这会导致浏览器从CSS文件所在的服务器上请求一个合适的字体文件(eot,woff,ttf或svg)。
然而,当浏览器从cdn.keywest.life请求该字体文件时,它读取Access-Control-Allow-Origin头文件的头文件,但没有找到,因此它给出了该错误消息。(这对我来说像是浏览器的bug,因为它与CSS文件来自同一个服务器)。
相反,当你使用maxcdn.bootstrapcdn.com时,响应中会包含Access-Control-Allow-Origin:*头文件,浏览器会接受这个字体文件。如果你的cdn服务器包含了这个头文件,那么它也会工作。
如果您有Apache服务器,请参阅以下答案:Font-awesome not properly displaying on Firefox / how to vend via CDN?

qcbq4gxm

qcbq4gxm3#

访问font-awesome资产的问题对于许多人来说是一个问题,没有对该问题的全面解释和解决方案。

什么是CORS:

跨源资源共享(CORS)是一种使用附加HTTP头的机制,它允许用户代理从与当前使用的站点不同的源(域)上的服务器获取访问所选资源的权限。当用户代理从与生成当前文档的域、协议或端口不同的域、协议或端口请求资源时,它会发出跨源HTTP请求。
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

问题:

问题源于font-awesome字体的加载方式。

@font-face{
    font-family:'FontAwesome';
    src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');
    src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');
    font-weight:normal;
    font-style:normal
}

字体是通过样式表(CSS)加载的。这里的情况是:

解决方案:

虽然已在文件存储(例如S3)上创建了CORS规则,并且已将资源访问权限授予相关域,但当CDN尝试加载CSS中指定的字体时,加载这些字体时指定的源/域是CDN的源/域,但未将CORS访问权限授予CDN域。

为CDN域创建CORS规则。

ebdffaop

ebdffaop4#

我使用的CDN不允许我修改它的响应,所以我修改了font-awesome.min.css,用绝对路径替换了相对路径,它工作了。

goucqfw6

goucqfw65#

没有一个答案对我有效,我不得不在maxcnd后台创建一个边缘规则(它会更改您区域上的配置文件)
此处提供更多信息
https://www.maxcdn.com/one/tutorial/edge-rules-recipes/https://www.maxcdn.com/one/tutorial/create-a-rule/显示器

edqdpe6u

edqdpe6u6#

解决这个问题的办法是使用另一个cdn的fontawesome。
https://www.cdnpkg.com/font-awesome/5.11.0

bfhwhh0e

bfhwhh0e7#

如果你和我一样,使用的是官方的WordPress字体真棒插件,你会想进入设置,从“使用CDN”切换到“使用工具包”。

相关问题