我可以为域及其子域中的所有页面设置Access-Control-Allow-Origin标头吗?

时间:2014-05-27 12:00:06

标签: http-headers cross-domain webfonts

我正在尝试使用法律允许使用的webfont,但不要分发。我将字体文件托管在用于静态内容的单独域上。这两个域是不相关的(一个不是另一个的子域)。假设使用webfont的网站为example.com,托管该网站的网站为example.net

我在example.net

的.htaccess文件中尝试了这个
<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "example.com"
  </IfModule>
</FilesMatch>

但是,这允许字体仅在example.com的主页上工作。我再试一次:

    Header set Access-Control-Allow-Origin "example.com/*"

现在除了主页之外,所有字体都在example.com 上工作,这当然不是我想要的。

我找不到此标题的任何文档。我真正想要的是允许example.comwww.example.com上的所有网页(或者,好的话,*.example.com)。有一个简单的方法吗?我猜这个标题需要某种正则表达式。

寻找我找到的文件,

  • 很多关于此标头如何与ajax交互的内容,
  • 很多简短的说明说这对于webfonts是必要的(至少在Firefox中)。

我没有找到任何关于标头本身语法的文档,或者如何指定域的变体。

基于an answer to a related question,我尝试了这个:

<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "http(s)?://(www\.)?(example.com)$" AccessControlAllowOrigin=$0$1
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        Header set Access-Control-Allow-Credentials true
    </IfModule>
</FilesMatch>

我的理解是,这会为每个请求设置一个单独的标题,允许每个请求页面单独使用该字体。但是,使用Firebug进行检查时,主页和其他地方的标题始终为http://example.com。尽管如此,这仍然有效,但令我感到困惑。相关问题显示a similar setup was not working for someone else。他的问题表明,对于他来说,实际上 为每个请求页面发送了一个不同的标题,因此HTTP 304 Not Modified响应正在中断。他的解决方案是向always添加.htaccess指令,但对我来说导致HTTP 500错误。

现在,它正在运行,当example.com切换到HTTPS时,认为将继续工作(很快就会如此)。但是,我不禁觉得它太复杂了。它每次都设置相同的标题,但是使用复杂的模式匹配来执行此操作。此外,虽然我对HTTP 304 Not Modified响应没有任何问题(事实上,我还没有看到任何此类响应:浏览器根本不会请求字体文件,直到我清除缓存),我担心将来可能会看到它们。

2 个答案:

答案 0 :(得分:4)

正如CORS spec所述,Access-Control-Allow-Origin标题中只有一个域(或*null)。

所以是的,您需要根据请求网站的域名来设置不同的标头。这就是为什么您发布的apache配置代码段尝试匹配请求的Origin标头与此regex

http(s)?://(www\.)?(example.com)$

$匹配字符串的结尾。因此,此正则表达式将匹配http://www.example.comhttp://example.com及其https等效项的请求,但不匹配example.com/bla。这应该没问题,因为请求的Origin标头以及响应should containAccess-Control-Allow-Origin标头只有主机而不是子页面。

因此,当您在页面http://example.com/about-us上时,浏览器会发送类似以下请求的内容,以便从http://cdn.net/myfont.otf获取字体:

GET /myfont.otf HTTP/1.1
Host: http://cdn.net
Origin: http://example.com

服务器将在Origin标头上进行模式匹配,并返回:

Access-Control-Allow-Origin: http://example.com

答案 1 :(得分:0)

作为参考,我为了同样的目的更新了 / etc / apache2 / conf / sites-enabled / * 文件。我的代码:

   <Directory /var/www/dir>
     AllowOverride FileInfo Options
     Header set Access-Control-Allow-Origin "http://example.com"
     Header set Access-Control-Allow-Origin "http://www.example.com"
   </Directory>

我必须处理的一件事 - 我没有启用 mod_headers ,因此重启apache失败了。我必须使用

启用它
a2enmods headers