【问题标题】:How to add an Access-Control-Allow-Origin header如何添加 Access-Control-Allow-Origin 标头
【发布时间】:2011-06-27 21:27:02
【问题描述】:

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

Firefox(支持@font-face 从 v3.5) 不允许跨域 默认字体。这意味着字体 必须从同一个域提供 (和子域),除非您可以添加 “访问控制允许来源”标题 到字体。

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

【问题讨论】:

标签: header cors font-face


【解决方案1】:

所以你要做的是......在字体文件文件夹中放置一个包含以下内容的htaccess文件。

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

同样在您的远程 CSS 文件中,font-face 声明需要字体文件的完整绝对 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 文件相同的目录中。
  • 此解决方案也适用于跨域 .ajax 请求!不错!
  • @StrayObject - 远程 CSS 文件将需要使用完整路径。本地 CSS 文件不必如此。
  • 您的 css 文件也需要使用 Access-Control-Allow-Origin 提供,因为它是指定可以加载哪些外部资源的源文件 ("\.(ttf|otf|eot|woff|css)$")。
  • 这个答案 (stackoverflow.com/a/4110601) 似乎表明逗号分隔的列表不起作用
【解决方案2】:

根据the official docs,浏览器不喜欢你用的时候

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 指令正在做的事情。

【讨论】:

  • 这似乎也对我有用,尽管如果您访问访问该站点的两个不同站点,它似乎具有需要清除缓存的副作用
  • @Jack:是的,它对于 CDN 内容(看着你,字体文件)来说很重要。根据缓存设置,您最终可能会在本地(如您的场景)或代理上保留文件内容和不正确的 CORS 标头! (使用 ?yourdomain 进行缓存清除在后一种情况下有效,但会降低使用 CDN 的好处)
  • 由于某些原因,没有为我设置 HTTP_ORIGIN,我不得不添加这一行 SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1
【解决方案3】:

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

由于从未生成 Apache 标头(因为我的 CSS 不在 Apache 上),我必须做几件事:

  1. 转到 Cloud Files UI 并为每个 font-awesome 文件添加一个自定义标题(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 可能会提供类似的工具来编辑对象标题和更改内容类型,所以也许你会很幸运(并在此处发布一些额外信息)。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      在你的请求ajax的file.php中,可以设置value header。

      <?php header('Access-Control-Allow-Origin: *'); //for all ?>
      

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 2016-01-11
        • 1970-01-01
        • 2021-11-28
        • 2019-02-07
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        相关资源
        最近更新 更多