如何让 nginx 支持 @font-face 格式并允许 access-control-allow-origin?

med*_*iev 28 nginx http-headers

我已将这些规则添加到mime.types

application/x-font-ttf                ttf;
font/opentype                         otf;
application/vnd.ms-fontobject         eot;
font/x-woff                           woff;
Run Code Online (Sandbox Code Playgroud)

现在,每一个都正确设置了 Content-Type 标头。我现在唯一的问题是 Firefox 需要 Access-Control-Allow-Origin。我用谷歌搜索了这个答案并将其添加到我的服务器指令中:

location ~* \.(eot|ttf|woff)$ {
    add_header Access-Control-Allow-Origin *;
}
Run Code Online (Sandbox Code Playgroud)

但现在我的字体根本没有提供。

相反,error.log报告说它试图在本地文件系统上打开它们..

2010/10/02 22:20:21 [error] 1641#0: *15 open() "/usr/local/nginx/html/fonts/mgopenmodernabold-webfont.woff" 失败 (2: 没有那个文件或目录) ,客户端:69.164.216.142,服务器:static.arounds.org,请求:“HEAD /fonts/mgopenmodernabold-webfont.woff HTTP/1.1”,主机:“static.arounds.org”

任何想法可能与语法有关?我是否需要明确添加一条规则,说不要尝试在本地打开它或什么?

编辑:我认为问题是我现在服务于 2 个不同的地点。而不是我应该在主要的内部进行正则表达式检查,然后提供标题。

med*_*iev 26

哇!明白了.. 这几乎是我在编辑中所怀疑的,我基本上必须在我的鞋底进行正则表达式文件名检查,location {}而不是进行替代。

    location / { 
            root /www/site.org/public/;
            index index.html;

            if ($request_filename ~* ^.*?/([^/]*?)$)
            {
                set $filename $1; 
            }

            if ($filename ~* ^.*?\.(eot)|(ttf)|(woff)$){
                add_header Access-Control-Allow-Origin *;
            }
    }
Run Code Online (Sandbox Code Playgroud)

  • 不,你真的没有。您只需要了解上下文继承。如果您在服务器块中指定站点根指令,那么它将在所有位置块中可用。我建议你阅读这个:http://blog.martinfjordvald.com/2010/07/nginx-primer/ (8认同)

小智 13

location ~* \.(eot|ttf|woff)$ {
    add_header Access-Control-Allow-Origin *;
}
Run Code Online (Sandbox Code Playgroud)

如果您有其他字体扩展名,请密切注意添加它们。现在通常有:eot|ttf|woff|woff2|svg,所以你应该像这样调整:

location ~* \.(eot|ttf|woff|woff2|svg)$ {
    add_header Access-Control-Allow-Origin *;
}
Run Code Online (Sandbox Code Playgroud)

  • **注意:** 如果给定的解决方案对您不起作用,请阅读 [this](https://github.com/h5bp/server-configs/issues/85) 和 [this](https://github .com/h5bp/server-configs/blob/master/nginx/conf/cross-domain-fonts.conf)。它很有启发性,您可能会发现它不起作用的原因。 (3认同)

小智 6

所有资产

这将使所有资产正常工作。root如果要定义新位置,可以添加

location ~ \.(js|css|png|jpg|jpeg|gif|ico|html|woff|woff2|ttf|svg|eot|otf)$ {
    add_header "Access-Control-Allow-Origin" "*";
    expires 1M;
    access_log off;
    add_header Cache-Control "public";
}
Run Code Online (Sandbox Code Playgroud)


小智 5

另一个解决方案:将所有字体放入,例如,static/fonts然后添加

location /static/fonts  {
    add_header "Access-Control-Allow-Origin" *;
    alias /var/www/mysite/static/fonts;
}
Run Code Online (Sandbox Code Playgroud)