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

TRi*_*RiG 11 cross-domain webfonts http-headers

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

我在.htaccess文件中试过这个 example.net

<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "example.com"
  </IfModule>
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

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

    Header set Access-Control-Allow-Origin "example.com/*"
Run Code Online (Sandbox Code Playgroud)

现在字体可以在example.com 除主页之外的任何地方工作,这当然不是我想要的.

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

寻找我发现的文档,

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

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

根据相关问题的答案,我试过这个:

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

mb2*_*b21 4

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

所以是的,您需要根据请求站点的域来设置不同的标头。这就是为什么您发布的 apache 配置片段尝试使用此正则表达式Origin在请求标头上进行匹配:

http(s)?://(www\.)?(example.com)$
Run Code Online (Sandbox Code Playgroud)

匹配$字符串的结尾。因此,此正则表达式将匹配来自http://www.example.comhttp://example.com及其 https 等效项的请求,但不匹配example.com/bla。这应该没问题,因为Origin请求的标头以及Access-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
Run Code Online (Sandbox Code Playgroud)

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

Access-Control-Allow-Origin: http://example.com
Run Code Online (Sandbox Code Playgroud)