大家好,我正试图从AEM6.1实例中获取字体,并在我的本地apache服务器外部站点AEM实例中创建一个index.html,如下所示:
index.html
<link rel="stylesheet" type="text/css" href="http://localhost:4502/etc/designs/geometrixx/clientlibs/css/fonts.css" />
内部字体.css:
@font-face {
font-family: 'roboto';
src: url('fonts/roboto_medium/Roboto-Medium-webfont.eot');
src: url('fonts/roboto_medium/Roboto-Medium-webfont.eot?#iefix') format('embedded-opentype'),
url('fonts/roboto_medium/Roboto-Medium-webfont.woff') format('woff'),
url('fonts/roboto_medium/Roboto-Medium-webfont.ttf') format('truetype'),
url('fonts/roboto_medium/Roboto-Medium-webfont.svg#robotomedium') format('svg');
font-weight: 500;
font-style: normal;
}
这是浏览器响应的图像:请求的资源上不存在"Access Control Allow Origin"标头。
我尝试在CSS文件中使用字体的绝对路径,并且这些文件在AEM中,但我得到了相同的响应。有什么想法吗?
谢谢!
下面的SlingFilter应该允许您从另一个域访问这些字体
@SlingFilter(label = "Cross-Origin Request Filter",
metatype = true,
scope = SlingFilterScope.REQUEST,
order = -100)
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (response instanceof SlingHttpServletResponse) {
SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
slingResponse.setHeader("Access-Control-Allow-Origin", "*");
slingResponse.setHeader("Access-Control-Allow-Credentials", "false");
}
chain.doFilter(request, response);
}
}
来源:https://gist.github.com/mickleroy/5ee8ed51ac245a8b59024a4ffec7cf7f
更新
我强烈建议不要这样做,因为它要求AEM实例可以通过公共互联网访问,这违背了建议的AEM部署架构,因为它不是由具有调度器模块的web服务器引导的。这种变通办法只能用于开发。推荐的方法是在Apache配置中添加Access-Control
头(根据我最初的回答):
<FilesMatch ".(eot|ttf|otf|woff|woff2)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
Header set Access-Control-Allow-Credentials "false"
</IfModule>
</FilesMatch>
按照另一个答案的建议,启用来自所有域的跨源请求是个坏主意。将该片段放在AEM代码中可能会危及网站的安全。
从大局来看,有两种方法可以避免CORS问题:
- 允许来自某些域(但不是任何域,这可能很危险。这可以通过设置
Access-Control-*
标头来实现。只需确保将值限制在受信任的域即可 -
从同一域提供资源。
如果你使用的是dispatcher mod,你可以让Apache缓存页面、资产和客户端库由AEM返回,只需提供缓存中的字体文件。浏览器无论如何都会访问Apache,无论文件是直接来自Apache本身还是从AEM检索到,它都是完全透明的。
或者,如果你正在寻找一个快速、即时的解决方案,允许你在本地机器上加载字体,你可以在Apache上使用
mod_proxy
,让它从AEM请求字体,并将其传递到浏览器。查看Apache:使用反向代理并运行本地网站以获得类似的示例。