应优先使用 content-security-policy: frame-ancestors 防护,x-frame-options 仅兼容 ie10/11;须在 server 或特定 location 块中单点配置,加 always 参数确保错误页也生效,禁用已废弃的 allow-from。

直接在 Nginx 配置中加 add_header X-Frame-Options SAMEORIGIN 是常见做法,但仅这样配置容易出问题——现代浏览器基本忽略它,且可能因重复设置导致响应被拒收。真正有效的防护应以 Content-Security-Policy: frame-ancestors 为主,X-Frame-Options 仅作 IE10/11 或老旧环境兼容用。
只在必要位置设置一次,避免多层叠加
该头必须严格限定在单一作用域:推荐放在 server 块中;若只保护静态 HTML,可放在 location ~ \.html$ 块内。切勿同时在 http、server、location 多处添加,否则可能触发多头冲突,部分浏览器直接丢弃整个响应。
值只能选 DENY 或 SAMEORIGIN,禁用 ALLOW-FROM
- DENY:完全禁止任何嵌套,适合不对外提供 iframe 接入的后台页或敏感页面
- SAMEORIGIN:仅允许同域名嵌套,适用于微前端主应用加载子应用等场景
- ALLOW-FROM 已被 Chrome 46+、Firefox 76+ 彻底废弃,Nginx 中配置无效,且会引发兼容性风险,务必删除
必须加上 always 参数
错误页(如 404、500)同样可能被恶意利用嵌套,所以要确保所有响应都携带该头:
add_header X-Frame-Options "SAMEORIGIN" always;
不加 always,Nginx 默认只对 2xx/3xx 响应生效,错误页将裸奔。
确认静态资源由同一 location 规则返回
比如你把 HTML 放在 /pages/ 目录下,但 Nginx 配置里只在 location / 加了头,而 /pages/ 被另一个 location ^~ /pages/ 拦截且未设头,这部分页面就漏防了。检查所有 HTML 路径是否都被覆盖,必要时在对应 location 内显式添加。











