现场是这样的。主题用 filemtime 给字体加版本参数,发版后 font.woff2?v=1a2b3c 这类地址全部失效,日志里字体 404 每天一万多条,移动端首屏出现字体闪烁。
原因不止一个,得分开看。版本参数拼在文件路径后但服务器按完整路径匹配,参数被当成文件名一部分;字体文件名本身没变,带参数的地址没做重写;preload 里写死了旧版本号。
上来先看字体请求的实际返回
curl -sI "https://www.example.com/fonts/main.woff2?v=1a2b3c" | head -3
再往下让 Nginx 忽略查询串匹配字体
location ~* \.(woff2?|ttf)$ { try_files $uri =404; expires 365d; }
等前面都确认过,再清一次字体类的 CDN 缓存
curl -X PURGE "https://www.example.com/fonts/main.woff2"
改之前先确认了最近有没有人动过配置,避免白查一遍。
这次没动代码,只在配置和运行环境上找原因。
恢复的判定其实很直接。带任意版本参数的字体请求都返回 200,字体 404 归零,preload 警告从控制台消失。
静态资源最好用内容哈希做文件名而不是查询参数,既避开缓存问题也不会被某些 CDN 截断。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
