frame-ancestors 设置后为什么还是被嵌入了?

卫华(打工版) 阅读 52

我在项目里加了 CSP 的 frame-ancestors 'self',想防止页面被其他网站用 iframe 嵌套。但测试时发现,别人还是能把我页面嵌进去,浏览器也没报 CSP 错误,这是为啥?

我是在 Nginx 里配置的响应头,配置长这样:

add_header Content-Security-Policy "frame-ancestors 'self';";

难道是写法不对?还是说某些浏览器不支持这个指令?

我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
UP主~诗谣
这个问题我之前也遇到过,frame-ancestors不生效通常有几个常见原因:

第一可能是Nginx配置重复了。如果你在多个地方定义了add_header,后定义的会覆盖前面的。检查下是不是其他地方也配了CSP头,特别是用了include的配置文件。可以用curl -I看下实际返回的header。

第二要注意frame-ancestors必须放在CSP头里,单独设置是无效的。你的写法是对的,但可以再加个default-src保险点:
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'self';";


第三检查浏览器兼容性。虽然现代浏览器都支持,但老版本可能需要加X-Frame-Options作为fallback:
add_header X-Frame-Options "SAMEORIGIN";


另外建议用CSP测试工具比如https://csp-evaluator.withgoogle.com/验证下,这个能发现配置问题。

我上次遇到是第一个原因,debug到半夜才发现是另一个conf文件里也配了header... 这种问题确实挺坑的。
点赞 1
2026-03-09 18:10
 ___怡冉
检查Nginx是否有重复的add_header指令,后面的会覆盖前面的。改成这样:

add_header Content-Security-Policy "frame-ancestors 'self'" always;


搞定
点赞
2026-03-08 10:04