在Apache中配置X-Frame-Options是防止点击劫持最直接有效的方式,需启用headers模块、使用Header always set确保不被后端覆盖,并在虚拟主机或全局配置中设为SAMEORIGIN或DENY,反向代理时须显式重设,最后通过浏览器开发者工具和iframe测试验证生效。

在 Apache 中用 mod_headers 配置 X-Frame-Options 是防止点击劫持最直接有效的方式,关键在于模块启用、语法正确、作用域合理,且避免被后端覆盖。
确认并启用 headers 模块
该模块必须处于启用状态,否则所有 Header 指令都会被忽略:
- Debian/Ubuntu 系统执行:
a2enmod headers && systemctl restart apache2 - CentOS/RHEL 系统检查
/etc/httpd/conf/httpd.conf或/etc/httpd/conf.modules.d/00-base.conf,确保有这一行未被注释:LoadModule headers_module modules/mod_headers.so - 重启 Apache 后,可通过
apache2ctl -M | grep headers(或httpd -M | grep headers)验证是否加载成功
配置 X-Frame-Options 响应头
推荐使用 Header always set 而非 append 或 set,确保它不会被 PHP、Node.js 等后端响应覆盖:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在虚拟主机配置(
<VirtualHost>)、目录配置(<Directory>)或.htaccess中添加:Header always set X-Frame-Options "SAMEORIGIN" - 若需全局禁止嵌入(如管理后台),改用:
Header always set X-Frame-Options "DENY" - 不建议使用
ALLOW-FROM—— 主流浏览器已废弃支持,实际无效
注意反向代理场景
如果 Apache 做反向代理(例如代理到 Node.js、Python 后端),默认会丢弃原始响应头。此时必须显式继承或重设:
- 在
ProxyPass所在的<Location>或<VirtualHost>块中,额外加上:Header always set X-Frame-Options "SAMEORIGIN" - 不要依赖后端设置,因为代理链中可能被清除;统一由 Apache 最外层注入更可靠
验证是否生效
配置完成后必须手动验证,不能只看服务是否启动:
- 用浏览器打开目标页面,按 F12 → Network → 刷新 → 点击任意 HTML 请求 → 查看 Response Headers 中是否存在
X-Frame-Options: SAMEORIGIN - 快速测试是否起作用:新建一个本地 HTML 文件,内含
<iframe src="https://your-site.com"></iframe>,用 Chrome/Firefox 打开——若 iframe 显示为空白或报错(如Refused to display ... in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'),说明配置成功 - 常见失败原因:模块未启用、写在
<IfModule headers_module>外导致语法错误、配置位置在ProxyPass之后被覆盖、用了Header set被后端 header() 覆盖

















