我正在尝试使用法律允许使用的webfont,但不要分发。我将字体文件托管在用于静态内容的单独域上。这两个域是不相关的(一个不是另一个的子域)。假设使用webfont的网站为example.com
,托管该网站的网站为example.net
。
我在example.net
<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.com
和www.example.com
上的所有网页(或者,好的话,*.example.com
)。有一个简单的方法吗?我猜这个标题需要某种正则表达式。
寻找我找到的文件,
我没有找到任何关于标头本身语法的文档,或者如何指定域的变体。
基于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
响应没有任何问题(事实上,我还没有看到任何此类响应:浏览器根本不会请求字体文件,直到我清除缓存),我担心将来可能会看到它们。
答案 0 :(得分:4)
正如CORS spec所述,Access-Control-Allow-Origin
标题中只有一个域(或*
或null
)。
所以是的,您需要根据请求网站的域名来设置不同的标头。这就是为什么您发布的apache配置代码段尝试匹配请求的Origin
标头与此regex:
http(s)?://(www\.)?(example.com)$
$
匹配字符串的结尾。因此,此正则表达式将匹配http://www.example.com
,http://example.com
及其https等效项的请求,但不匹配example.com/bla
。这应该没问题,因为请求的Origin
标头以及响应should contain的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
服务器将在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