如何添加Access-Control-Allow-Origin标头


99

我正在设计一个网站(例如,mywebsite.com),并且此站点从另一个站点(例如anothersite.com)加载字体字体。我在Firefox中加载字体字体时遇到问题,我在此博客上阅读:

Firefox(从v3.5开始支持@ font-face)默认情况下不允许跨域字体。这意味着必须从相同的域(和子域)提供字体,除非您可以在字体中添加“ Access-Control-Allow-Origin”标头。

如何将Access-Control-Allow-Origin标头设置为字体?


Answers:


164

所以,您要做的是...在字体文件文件夹中,放入带有以下内容的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

(当前实现中不支持多个值)


1
您不必使用完整路径。url('/fonts/League_Gothic.woff') format('woff')假设您将'fonts'文件夹与.css文件放在同一目录中,那么简单就足够了。
StrayObject

1
该解决方案也适用于跨域.ajax请求!真好!
以撒

3
@StrayObject-远程CSS文件将需要使用完整路径。本地CSS文件不是必须的。
Mazatec 2011年

显然不可能将多个URL(用逗号分隔或以其他方式分隔)列入白名单;看到bug 671608
Tgr

1
这个答案(stackoverflow.com/a/4110601)似乎表明以逗号分隔的列表不起作用
Asaf 2013年

21

根据官方文档,当您使用

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指令正在执行的操作。


2
这似乎也对我有用,尽管如果您访问两个访问该站点的不同站点,这似乎有需要清除缓存的副作用
Jack James

1
@Jack:是的,这是CDN内容的一大特色(看着您,字体文件)。根据缓存设置的不同,您可能最终得到文件内容和不正确的CORS标头,该标头在本地(如您的方案)或在代理中持续存在!(?yourdomain在后一种情况下,使用缓存清除会起作用,但会稍微贬低使用CDN的好处)
2013年

2
由于某些原因,未为我设置HTTP_ORIGIN,我不得不添加此行SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1
David Riccitelli 2014年

5

不幸的是,接受的答案对我不起作用,因为我的站点CSS文件@import字体CSS文件,并且这些文件都存储在Rackspace Cloud Files CDN中。

由于永远不会生成Apache标头(因为我的CSS不在Apache上),所以我必须做几件事:

  1. 转到Cloud Files用户界面,并为每个字体超赞的文件添加自定义标头(带有值*的Access-Control-Allow-Origin)
  2. 将woff和ttf文件的Content-Type分别更改为font / woff和font / ttf

看看您是否可以只使用#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可能提供类似的功能来编辑对象标题和更改内容类型,因此也许您会很幸运(并在此处发布一些其他信息)。


3

对于基于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>


1

在请求ajax的file.php中,可以设置值标头。

<?php header('Access-Control-Allow-Origin: *'); //for all ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.