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.com和www.example.com(或好措施,*.example.com).有一个简单的方法吗?我猜这个标题需要某种正则表达式.
寻找我发现的文档,
我没有找到任何关于标头本身语法的文档,或者如何指定域的变体.
根据相关问题的答案,我试过这个:
<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回复没有任何问题(事实上,我还没有看到任何这样的回复:浏览器根本不会请求字体文件,直到我清除缓存),我担心我可能将来看他们.
正如CORS 规范中所述,标头中只能有一个域Access-Control-Allow-Origin(或*或null)。
所以是的,您需要根据请求站点的域来设置不同的标头。这就是为什么您发布的 apache 配置片段尝试使用此正则表达式Origin在请求标头上进行匹配:
http(s)?://(www\.)?(example.com)$
Run Code Online (Sandbox Code Playgroud)
匹配$字符串的结尾。因此,此正则表达式将匹配来自http://www.example.com、http://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)
| 归档时间: |
|
| 查看次数: |
15795 次 |
| 最近记录: |