@ font-face字体只能在自己的域名上工作

我正在尝试创build一种字体库,以便在我的网站上使用,这样我就可以在我的css中调用任何字体,而无需其他任何设置。 为此,我创build了一个子域,在该子域上,我为存储库中的每个字体放置了文件夹,每个字体包含各种文件types。 我还在子域的根部放置了一个名为font-face.css的css文件,并为每种@font-face填充了@font-face声明,字体用绝对链接连接起来,以便在任何地方使用。

我的问题是,我似乎只能使用他们所在的子域上的字体,在我的其他网站字体不显示。 使用萤火虫我确定font-face.css文件已成功连结并加载。 那为什么字体没有正确加载? 对字体文件有保护吗? 我正在使用所有的字体,我应该允许这样做,所以我不明白为什么会发生这种情况。 也许这是一个Apache的问题,但我可以下载字体就好了,当我链接到它。

哦,只是为了澄清,我没有违反任何版权设置了这一点,我使用的所有字体都允许这样的事情。 但是,我想设置一种方式,只有我可以访问这个字体库,但这是另一个项目。

这是因为Firefox(从你提到的Firebug)认为跨域,甚至子域名,Web字体embedded是一个坏主意。

您可以说服它从您的子域中加载字体,方法是将此字体添加到要提供字体的子域的顶级.htaccess文件中(更新为修改HTML5 Boilerplate中同一文件中的代码 ):

 <FilesMatch "\.(ttf|ttc|otf|eot|woff)$"> <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> </FilesMatch> 

对此回应:

但是,我想设置一种方式,只有我可以访问这个字体库,但这是另一个项目。

Access-Control-Allow-Origin W3C规范没有提到任何通配符"*"或特定域。 到目前为止,我已经find了这个答案 ,它build议validationOrigin头,但我认为这是一个Firefox的头。 我不确定其他浏览器(他们甚至不需要上面的.htaccess技巧来使跨域Web字体正常工作)。

另一种解决这个问题的方法是使用base64编码将字体直接embedded到css文件中。 特别漂亮,如果你没有访问上面提到的一些configuration。

您可以在fontsquirrel.com上生成必要的代码:在font-face Kit Generator中select专家模式,向下滚动并selectCSS Options下的Base64 Encode – 下载的Font-Kit将准备好即插即用。

这也有减less页面加载时间的附带好处,因为它需要less一个http请求。

如果您不希望允许来自所有网域的资源,而只允许来自网站的子域,则应该这样做:

 # Allow font, js and css to be loaded from subdomain SetEnvIf Origin "http(s)?://(.+\.)?(example\.com)$" ORIGIN_DOMAIN=$0 <IfModule mod_headers.c> <FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff|js|png|jpg|jpeg|gif)$"> Header set Access-Control-Allow-Origin %{ORIGIN_DOMAIN}e env=ORIGIN_DOMAIN </FilesMatch> </IfModule> 

资料来源: http : //www.webspeaks.in/2015/01/wordpress-allow-cross-domain-resources.html

在“expert”模式下使用http://www.fontsquirrel.com/fontface/generator并selectbase64作为选项返回一个stylesheet.css,在我们的样式表中使用必要的base64编码数据。; 似乎可以在除IE8以外的所有浏览器中运行。

我们遇到这个问题时最主要的第三方工具,如萨尔萨请愿的主题,我们被迫承载的字体。

感谢所有人的帮助!