Nginx提供高性能字体服务需三步:配置跨域头解决CORS问题,补全MIME类型确保正确识别,启用gzip压缩与一年期强缓存(含immutable)。

用 Nginx 提供高性能字体服务,核心是三件事:让浏览器能跨域加载、确保字体被正确识别和压缩、以及启用强缓存避免重复下载。这几项配置叠加后,字体首次加载快、后续访问几乎不走网络,体验明显提升。
正确声明跨域头,解决 CORS 阻塞
浏览器对字体文件执行严格跨域检查,哪怕只是子域名调用主站字体,也会报错“no 'Access-Control-Allow-Origin' header”。必须在 Nginx 中显式放行:
- 匹配常见字体后缀(大小写不敏感):
location ~* \.(eot|ttf|woff|woff2|otf|svg)$ - 添加基础跨域头:
add_header Access-Control-Allow-Origin *;(生产环境建议指定具体域名,如https://example.com) - 处理 OPTIONS 预检请求,直接返回 204:
if ($request_method = 'OPTIONS') {<br> add_header Access-Control-Allow-Origin *;<br> add_header Access-Control-Allow-Methods GET,OPTIONS;<br> add_header Access-Control-Allow-Headers DNT,User-Agent,X-Requested-With,Cache-Control,Content-Type,Range;<br> add_header Access-Control-Max-Age 1728000;<br> add_header Content-Length 0;<br> return 204;<br> }
补全 MIME 类型,避免解析失败
Nginx 默认 mime.types 对部分字体支持不全(比如 woff2 在旧版本中缺失),会导致响应头 Content-Type 错误,某些浏览器拒绝渲染:
- 编辑
/etc/nginx/mime.types,在 font 相关区块补充:font/woff2 woff2;<br> application/font-woff2 woff2;<br> font/woff woff;<br> application/font-woff woff;<br> application/vnd.ms-fontobject eot;<br> font/ttf ttf;<br> font/otf otf;
- 确认 Nginx 版本 ≥ 1.13.5,否则
font/woff2可能不被识别,优先用application/font-woff2
启用 gzip 压缩与强缓存策略
字体文件体积普遍较大(尤其 woff2 仍常达 100KB+),压缩可减少传输量;而字体内容极少变更,适合一年期强缓存:
- 开启 gzip 并扩展类型:
gzip on;<br> gzip_types application/font-woff2 application/font-woff application/vnd.ms-fontobject font/ttf font/otf;
- 设置缓存头(配合哈希命名使用):
add_header Cache-Control "public, max-age=31536000, immutable";<br> etag off;
(immutable告诉浏览器无需发条件请求,etag off避免与 immutable 冲突) - 开发环境禁用该缓存策略,可通过
map指令按 $host 或环境变量区分配置
验证与避坑要点
配置生效后,务必通过浏览器 Network 面板验证:
- 选中字体请求 → Headers 标签 → 查看
Cache-Control、Content-Type、Access-Control-Allow-Origin是否存在且正确 - 刷新页面,状态码应为
200 (from memory cache)或200 (from disk cache),而非 200(网络) - 若使用 CDN,确认其未过滤或覆盖
Cache-Control和跨域头;必要时在 CDN 后台开启“透传自定义响应头” - 第三方字体(如 Google Fonts)无法控制其响应头,关键字体建议自托管并应用上述全部优化



















