先把当时的情况摆出来。上线内容安全策略之后,百度统计的报表从某天开始全部归零。浏览器控制台里能看到 hm.baidu.com 的脚本被拒绝执行,站点的 CSP 只放了自家域名和两个 CDN,第三方统计和广告脚本都被一起拦掉了。

这类报错背后常见的原因有几处,逐个排除就行。CSP 的 script-src 没有放行统计域名 脚本加载即失败。另一种情况是统计代码是内联注入 被 CSP 的非内联策略直接阻止。

少数情况下是上报接口的 connect-src 没放开 数据发出去了但被拒收。不容易想到的是,策略只加在 HTML 响应头 静态页与动态页的规则不一致。

动手时先确认 CSP 头里的实际白名单

curl -sI https://www.example.com/ | grep -i content-security-policy

然后放行统计脚本与上报接口

Content-Security-Policy: script-src 'self' https://hm.baidu.com; connect-src 'self' https://hm.baidu.com

给内联统计代码加一次性随机数

Content-Security-Policy: script-src 'self' 'nonce-abc123'

剩下的就是用浏览器控制台核对是否还有拒绝记录

curl -s https://www.example.com/ | grep -c 'hm.baidu.com'

怎么算真的好了,看的是同一批现象。放行之后当天就有数据回传,三天的报表恢复到拦截前的量级,控制台里也不再有拒绝执行的记录。

CSP 这类安全头会连带影响统计和广告,上线前最好在报告模式跑一周,看清哪些域名被拦再收紧。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189