Nginx配置Content-Security-Policy仍拦截BootstrapCDN资源排查
问题分析与解决办法
首先咱们得抓住问题的核心:你配置的*.bootstrapcdn.com并没有匹配到netdna.bootstrapcdn.com这个域名,这是CSP通配符规则的特性导致的。
为什么通配符不生效?
CSP里的*.example.com这类通配符,只会匹配example.com的所有子域名——比如cdn.bootstrapcdn.com、static.bootstrapcdn.com这类,但netdna.bootstrapcdn.com属于.bootstrapcdn.com域名的子域名,和bootstrapcdn.com是完全独立的域名主体,所以你的通配符规则根本覆盖不到它。
你看报错里的资源地址是http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css,它的域名是netdna.bootstrapcdn.com,和你配置的*.bootstrapcdn.com分属不同域名体系,自然会被CSP拦截。
解决办法
有几个灵活的方案可选:
- 直接把
netdna.bootstrapcdn.com加到style-src规则里,或者用通配符*..bootstrapcdn.com覆盖它的所有子域名,修改后的Nginx配置片段如下:add_header Content-Security-Policy "default-src 'self'; img-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.printfriendly.com *.w.org *.gravatar.com *.vimeocdn.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.w.org *.gravatar.com *.googleapis.com *.jsdelivr.net *.printfriendly.com *.kxcdn.com *.vimeocdn.com *.hs-analytics.net *.securitymetrics.com *.google-analytics.com; style-src 'self' 'unsafe-inline' *.googleapis.com *.bootstrapcdn.com *.gstatic.com *.vimeocdn.com *.netdna.bootstrapcdn.com; font-src 'self' data: *.googleapis.com *.bootstrapcdn.com *.gstatic.com *.googleapis.com; frame-src 'self' *.vimeocdn.com *.vimeo.com; object-src 'self'"; - 如果这个资源是唯一需要加载的,也可以直接写入完整资源地址(不过这种方式灵活性差,后续资源路径更新可能会再次触发拦截)。
额外检查项
- 浏览器缓存:修改配置后记得强制刷新页面(Ctrl+F5)或清空浏览器缓存,避免旧的CSP规则被缓存导致测试不准。
- Nginx配置优先级:如果你的Nginx配置里有多个
add_header指令(比如不同location块中),要确认当前CSP规则没有被其他add_header覆盖——Nginx中子块的add_header会替换父块的配置。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

