CSS 能加载,但图标或自定义字体不显示,控制台提示 font has been blocked by CORS policy。浏览器把字体视为跨源资源,CDN 必须返回与页面 Origin 匹配的允许头;错误 MIME 或缓存了不带 CORS 头的旧响应也会失败。
先固定复现条件和影响范围
记录页面 Origin、字体最终 URL、重定向链、Content-Type、Access-Control-Allow-Origin、Vary 和 CDN HIT/MISS。直接访问文件成功不代表字体上下文允许使用。
curl -skI -H 'Origin: https://shop.example.com' https://cdn.example.com/static/font.woff2
curl -skIL https://cdn.example.com/static/font.woff2
php bin/magento config:show web/secure/base_static_url
find pub/static -iname '*.woff*' -o -iname '*.ttf' | head
file pub/static/frontend/Vendor/theme/en_US/fonts/font.woff2
根据证据分支定位
CDN 无 Allow-Origin 而源站有,修 CDN 响应头策略;两者都无,配置静态资源服务器;返回 text/html 常是 404 或安全页,不是字体;只有首次 MISS 失败而 HIT 持续失败,检查 CDN 是否按 Origin 正确缓存及 Vary。
修复时保留回滚路径
对白名单店铺域名返回准确的 Access-Control-Allow-Origin,公共非凭据静态字体也可按安全策略使用通配符。确保 WOFF2 MIME 正确、URL 不重定向到另一未授权域名,并清除精确 CDN 对象;不要给所有动态接口无条件开放 CORS。
上线验收
在两个允许 Store 域名和一个不允许域名测试,字体、图标和 Network 请求符合策略。桌面与移动浏览器、生产和静态版本切换后都不再出现 CORS 错误。
生产环境操作前的检查
处理“Magento 2 CDN 字体被 CORS 拒绝”前,先记录 Magento 版本、部署模式、问题 Store View、复现时间和最近一次发布。所有 SQL 默认先执行 SELECT;任何写操作、目录清理或配置切换都应确认影响范围、保留备份并准备回滚。多节点环境要核对各节点代码版本、app/etc/env.php 配置摘要与流量分布。
php bin/magento --version
php bin/magento deploy:mode:show
php bin/magento maintenance:status
php bin/magento indexer:status
php bin/magento cache:status
命令应由 Magento 文件所有者在项目根目录执行。不要在生产高峰同时运行全量索引、静态部署和数据修复;涉及客户、支付、税费或订单的改动,先在脱敏数据副本验证。
建立可比较的排查记录
每次实验只改变一个变量,记录操作前值、命令、开始与结束时间、结果和回滚方式。准备一个正常对象与一个异常对象对照;若旧对象恢复而新对象仍能复现,说明根因尚未消除。
| 检查层 | 需要保存的证据 | 通过标准 |
|---|---|---|
| 入口层 | URL、状态码、请求 ID、节点 | 路由和协议一致 |
| 应用层 | 异常堆栈、模块、作用域 | 无新异常且可重复 |
| 数据层 | 主键、时间、关联行数 | 关系完整且无重复副作用 |
| 业务层 | 正常、失败、重试路径 | 最终结果一致 |
修复后的观察窗口
上线后至少观察一轮 Cron、队列和索引周期,并在两台节点、无痕浏览器和目标 Store View 重复验证。临时调试日志必须脱敏,确认错误率、响应时间和数据量稳定后及时关闭。

