Apache中配置X-Frame-Options防点击劫持需启用headers模块、在VirtualHost内用Header always set设置SAMEORIGIN或DENY,避开ALLOW-FROM废弃项及反向代理覆盖,并实测iframe渲染验证生效。

在 Apache 中用 mod_headers 设置 X-Frame-Options 是防御点击劫持最直接有效的方式之一,但配置需准确、作用域要合理,且必须避开常见覆盖陷阱。
确保 headers 模块已启用
该模块是前置条件,未启用则所有 Header 指令无效:
- Debian/Ubuntu 系统执行:
a2enmod headers && systemctl reload apache2 - RHEL/CentOS 系统检查
/etc/httpd/conf.modules.d/00-base.conf中是否含:LoadModule headers_module modules/mod_headers.so,并确认未被注释 - 验证是否生效:运行
apache2ctl -M | grep headers(或httpd -M | grep headers),输出应含headers_module (shared)
在合适位置添加 Header 指令
推荐在虚拟主机配置块(<VirtualHost>)内设置,避免写在 .htaccess 中(性能差、易被覆盖):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 基础防护(绝大多数站点适用):
Header always set X-Frame-Options "SAMEORIGIN" - 完全禁止嵌入(如登录页、管理后台、API 响应):
Header always set X-Frame-Options "DENY" - 不建议使用
ALLOW-FROM—— Chrome 79+、Firefox 69+ 已彻底废弃,配置后实际无效
注意反向代理与后端覆盖问题
若 Apache 作为反向代理(例如代理到 Node.js、Python 或 PHP-FPM),默认会丢弃原始响应头,导致 X-Frame-Options 失效:
- 在
ProxyPass后添加ProxyPassReverse并确保开启头继承:ProxyPreserveHost OnProxyPass / http://localhost:3000/ retry=0ProxyPassReverse / http://localhost:3000/ - 更稳妥做法:在代理配置段内显式重设该头,例如:
<Location "/"><br> Header always set X-Frame-Options "SAMEORIGIN"<br></Location>
- 检查后端代码(如 PHP 的
header()、Express 的res.set())是否重复设置或覆盖该头;多个同名响应头存在时,行为不可控
验证是否真正生效
不能只看 curl -I 返回里有没有这个头,必须实测渲染行为:
- 新建一个测试 HTML 文件,内容为:
<iframe src="https://your-domain.com/login" width="800" height="600"></iframe> - 用 Chrome/Firefox 打开该文件,观察 iframe 是否加载成功;若配置为
DENY,控制台应报错Refused to display '...' in a frame because it set 'X-Frame-Options' to 'DENY' - 打开开发者工具 → Network → 点击任意页面请求 → 查看 Response Headers,确认
X-Frame-Options值正确且未出现两次

















