nginx 中配置 x-frame-options 是防御点击劫持最直接有效的方式,应设为 deny 或 sameorigin 并加 always 参数,精准作用于 html 页面路径,同时搭配 csp frame-ancestors 提升兼容性与灵活性。

在 Nginx 中配置 X-Frame-Options 是防御点击劫持最直接有效的方式,它通过 HTTP 响应头告诉浏览器“不准被 iframe 套进去”,从源头阻断攻击链路。
明确策略值,按需选择 DENY 或 SAMEORIGIN
该响应头只支持三个值,但只有两个真正可用:
- DENY:任何页面都不允许嵌套当前页面,适合登录页、支付页、管理后台等高敏入口
- SAMEORIGIN:仅允许同协议+同域名+同端口的页面嵌套,适合内部子系统间需 iframe 协作的场景
- ALLOW-FROM 已被 Chrome 79+、Firefox 69+ 等主流浏览器弃用,不建议使用
加 always 参数,确保所有响应都生效
默认情况下,add_header 不会作用于 304、404、500 等非 200 响应。攻击者可能利用错误页绕过防护,所以必须加 always:
add_header X-Frame-Options "DENY" always;add_header X-Frame-Options "SAMEORIGIN" always;
精准配置到 HTML 页面路径,避免误伤
这个头只对 HTML 类内容有意义,不该加在 JS、CSS、API 接口或健康检查地址上:
- ✅ 推荐放在 PHP 处理块里:
location ~ \.php$ { add_header X-Frame-Options "SAMEORIGIN" always; } - ❌ 静态资源(
js/css/png)不用设,加了反而可能触发扫描告警 - ❌
/api/、/healthz等接口路径应显式排除,防止干扰前端调用逻辑
搭配 CSP 的 frame-ancestors 提升兼容性与灵活性
X-Frame-Options 是兼容性兜底,Content-Security-Policy: frame-ancestors 是现代首选:
- 现代浏览器优先执行
frame-ancestors,老浏览器回退到X-Frame-Options - 支持更细粒度策略,例如:
add_header Content-Security-Policy "frame-ancestors 'self' https://admin.example.com;" always; - 两者共存不冲突,建议同时配置以兼顾全量用户











