Apache如何通过单个LocationMatch动态设置字体文件MIME类型
Apache单规则动态匹配字体MIME类型配置方案
需求说明
需要根据文件后缀自动匹配对应字体MIME类型,映射规则如下:
/{path}/alpha.woff→font/woff/{path}/beta.woff2→font/woff2/{path}/gamma.ttf→font/ttf
要求仅使用一条LocationMatch配置项实现,无需为每类后缀单独编写规则。
报错原因
之前使用命名捕获组时抛出Unrecognized header format %错误,是因为Header set指令默认不会解析环境变量占位符,需要显式开启表达式解析支持,或使用规范的环境变量读取格式。
可用配置
Apache 2.4+ 推荐方案(最简洁)
直接在Header指令中增加expr=1参数,告知Apache将头值作为表达式解析,即可正确读取正则命名捕获组生成的MATCH_FONTTYPE变量:
<LocationMatch "\.(?<fonttype>(?i:woff|woff2|ttf))$"> Header set Content-Type "font/%{env:MATCH_FONTTYPE}" "expr=1" </LocationMatch>
配置说明:
- 正则中
(?i:)前缀表示不区分大小写匹配后缀,.WOFF、.Woff2这类大小写混合的文件也能正常识别 - 单条规则覆盖三类字体文件,无需重复编写匹配块
低版本兼容方案(适配Apache 2.2及以下)
如果使用较低版本Apache,可以借助mod_rewrite手动设置环境变量,再由Header指令读取:
<LocationMatch "\.(?i:woff|woff2|ttf)$"> RewriteEngine On RewriteRule "\.(woff|woff2|ttf)$" "-" [E=CUSTOM_FONTTYPE:$1,NC] Header set Content-Type "font/%{CUSTOM_FONTTYPE}e" </LocationMatch>
注意:使用该方案需要提前启用mod_rewrite模块,
%{变量名}e是Header指令读取环境变量的标准格式。
内容的提问来源于stack exchange,提问作者Vivek Dhiman
相关产品推荐
相关产品推荐

