我正在设计一个网站(例如,mywebsite.com),并且此站点从另一个站点(例如anothersite.com)加载字体字体。我在Firefox中加载字体字体时遇到问题,我在此博客上阅读:
Firefox(从v3.5开始支持@ font-face)默认情况下不允许跨域字体。这意味着必须从相同的域(和子域)提供字体,除非您可以在字体中添加“ Access-Control-Allow-Origin”标头。
如何将Access-Control-Allow-Origin标头设置为字体?
我正在设计一个网站(例如,mywebsite.com),并且此站点从另一个站点(例如anothersite.com)加载字体字体。我在Firefox中加载字体字体时遇到问题,我在此博客上阅读:
Firefox(从v3.5开始支持@ font-face)默认情况下不允许跨域字体。这意味着必须从相同的域(和子域)提供字体,除非您可以在字体中添加“ Access-Control-Allow-Origin”标头。
如何将Access-Control-Allow-Origin标头设置为字体?
Answers:
所以,您要做的是...在字体文件文件夹中,放入带有以下内容的htaccess文件。
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>
同样在远程CSS文件中,字体声明需要字体文件的完整绝对URL(本地CSS文件中不需要):
例如
@font-face {
font-family: 'LeagueGothicRegular';
src: url('http://www.example.com/css/fonts/League_Gothic.eot?') format('eot'),
url('http://www.example.com/css/fonts/League_Gothic.woff') format('woff'),
url('http://www.example.com/css/fonts/League_Gothic.ttf') format('truetype'),
url('http://www.example.com/css/fonts/League_Gothic.svg')
}
这样可以解决问题。需要注意的一件事是,您可以确切指定应该允许哪些域访问字体。在上面的htaccess中,我指定了每个人都可以使用我的字体,"*"
但是您可以将其限制为:
单个网址:
标头集Access-Control-Allow-Origin http://example.com
或以逗号分隔的URL列表
Access-Control-Allow-Origin: http://site1.com,http://site2.com
(当前实现中不支持多个值)
url('/fonts/League_Gothic.woff') format('woff')
假设您将'fonts'文件夹与.css文件放在同一目录中,那么简单就足够了。
根据官方文档,当您使用
Access-Control-Allow-Origin: "*"
标头,如果您还使用
Access-Control-Allow-Credentials: "true"
标头。相反,他们希望您明确允许其起源。如果仍然希望允许所有来源,则可以执行一些简单的Apache魔术使其正常工作(确保已mod_headers
启用):
Header set Access-Control-Allow-Origin "%{HTTP_ORIGIN}e" env=HTTP_ORIGIN
浏览器需要Origin
在所有跨域请求上发送标头。文档特别声明,Access-Control-Allow-Origin
如果您正在接受/计划接受请求,则需要在标头中回显此标头。这就是该Header
指令正在执行的操作。
?yourdomain
在后一种情况下,使用缓存清除会起作用,但会稍微贬低使用CDN的好处)
SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1
。
不幸的是,接受的答案对我不起作用,因为我的站点CSS文件@import字体CSS文件,并且这些文件都存储在Rackspace Cloud Files CDN中。
由于永远不会生成Apache标头(因为我的CSS不在Apache上),所以我必须做几件事:
看看您是否可以只使用#1,因为第二个需要一些命令行工作。
要在#1中添加自定义标头:
如果您需要继续并执行#2,则需要使用CURL的命令行
curl -D - --header "X-Auth-Key: your-auth-key-from-rackspace-cloud-control-panel" --header "X-Auth-User: your-cloud-username" https://auth.api.rackspacecloud.com/v1.0
从返回的结果中,提取X-Auth-Token和X-Storage-Url的值
curl -X POST \
-H "Content-Type: font/woff" \
--header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.woff
curl -X POST \
-H "Content-Type: font/ttf" \
--header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.ttf
当然,仅当您使用Rackspace CDN时,此过程才有效。其他CDN可能提供类似的功能来编辑对象标题和更改内容类型,因此也许您会很幸运(并在此处发布一些其他信息)。
对于基于Java的应用程序,请将其添加到您的web.xml文件中:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ttf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.otf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.eot</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff</url-pattern>
</servlet-mapping>
检查此链接。它肯定会解决您的问题。有很多解决方案可以使跨域GET Ajax调用在此处解决跨域的 POST请求。我花了三天的时间才弄清楚。