x-frame-options需手动配置于https server块并加always参数,deny最严,sameorigin推荐;与csp frame-ancestors冲突时优先用后者,须全路径验证生效。

HTTPS本身只负责传输加密,不自动提供页面级防护。安全响应头必须手动配置,且要放在 HTTPS server 块内才能生效。
必须加 always 参数
不加 always 时,Nginx 默认只给 2xx 成功响应加头,404、500、301 等错误或重定向响应会漏掉 X-Frame-Options,攻击者可借此绕过防护。
- 正确写法:add_header X-Frame-Options "SAMEORIGIN" always;
- 错误写法:add_header X-Frame-Options "SAMEORIGIN";(缺 always)
- 重启前务必运行 nginx -t 验证语法
取值选择要贴合业务场景
DENY 最严格,适合登录页、支付页、后台系统;SAMEORIGIN 更常用,允许自身子域名 iframe 嵌套,比如帮助中心嵌入产品介绍页。
- DENY:完全禁止任何 iframe 加载,无例外
- SAMEORIGIN:仅同协议+同域名+同端口允许嵌套(推荐多数 HTTPS 站点)
- ALLOW-FROM https://xxx.com/:已不被 Chrome/Firefox/Edge 支持,勿用
避免和 CSP 的 frame-ancestors 冲突
如果同时配置了 Content-Security-Policy 头并含 frame-ancestors 指令,浏览器会直接忽略 X-Frame-Options。两者不要混用同一策略。
- 新项目优先用 frame-ancestors 'self' https://partner.com';(支持多源)
- 老系统可保留 X-Frame-Options 作为 IE/旧 Firefox 兼容兜底
- 若两者共存,确保语义一致,例如都设为 SAMEORIGIN / 'self'
验证是否真正生效
不能只看首页,要覆盖关键路径和错误页。
- 用 curl -I https://yoursite.com/404.html 检查错误页是否带该头
- 浏览器打开 DevTools → Network → 刷新任意页面 → 查 Response Headers
- 建一个本地 HTML 文件,用 iframe 加载你的 HTTPS 页面,确认控制台报错“Refused to display”











