Apache中配置X-Frame-Options是防御点击劫持最直接、成本最低的手段,需启用headers模块、在VirtualHost或全局配置中用Header always set指定SAMEORIGIN或DENY,并避免被反向代理或后端覆盖,最后通过curl或DevTools验证生效。

在 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验证
在合适位置添加 Header 指令
推荐写在虚拟主机(<VirtualHost>)块内或全局主配置(如 /etc/apache2/apache2.conf),避免仅放在 .htaccess 中——后者依赖 AllowOverride Options=All,且性能开销大:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 最常用且稳妥的配置:
Header always set X-Frame-Options "SAMEORIGIN" - 若页面完全不允许嵌入(如登录页、支付页),改用:
Header always set X-Frame-Options "DENY" -
不要使用
ALLOW-FROM:Chrome 79+、Firefox 69+ 已彻底废弃,设了也无效
注意反向代理与后端覆盖问题
当 Apache 作为反向代理(例如代理到 Node.js、PHP-FPM 或 Java 应用)时,原始响应头可能被丢弃或覆盖:
- 默认情况下
ProxyPass不继承响应头,需显式开启:ProxyPreserveHost On并配合Header always set强制注入 - 若后端应用(如 Spring Boot、Django)也输出
X-Frame-Options,两者共存可能导致重复或冲突;建议统一由 Apache 控制,后端关闭相关安全中间件 - Nginx 做前置 CDN 或负载均衡时,确认它没有用
add_header重复添加该头,否则浏览器可能收到两个值,部分版本会拒绝渲染
验证是否真正生效
不能只看配置文件语法正确或 Apache 启动成功,要实测响应头是否到达客户端:
- 用
curl -I https://yoursite.com/login查看返回头中是否含X-Frame-Options: SAMEORIGIN - 打开 Chrome DevTools → Network → 点开任意 HTML 请求 → Headers → Response Headers,确认存在且值准确
- 建一个测试页面,含
<iframe src="https://yoursite.com/login"></iframe>,在非同源域名下打开——应加载失败或显示空白(取决于浏览器行为) - 特别检查静态资源(JS/CSS/图片)是否也被加上该头:虽然不影响功能,但若误加在 API 接口(如 JSON 返回)上,属于语义错误,可能触发扫描器告警

















