必须启用mod_headers模块且配置在或块中,header指令才生效;xampp默认禁用该模块和.htaccess解析,直接写.htaccess无效。

直接在 XAMPP 的 Apache 配置里加 Header 指令就能生效,但必须启用 headers_module,且不能只写在 .htaccess 里——本地开发环境默认不读取它。
Apache 必须启用 headers_module 才能用 Header 指令
XAMPP 自带的 Apache 默认禁用该模块,Header 指令会直接报错或静默失效。
- 打开
XAMPP\apache\conf\httpd.conf - 搜索
#LoadModule headers_module modules/mod_headers.so,去掉开头的#取消注释 - 重启 Apache(通过 XAMPP 控制面板)
- 验证是否加载成功:访问
http://localhost/server-status或运行httpd -M | findstr headers(Windows)
配置位置必须在 server 级,.htaccess 在 XAMPP 默认不生效
XAMPP 的 Apache 默认关闭了 AllowOverride All,所以即使你写了 .htaccess,Apache 也不会解析它。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 正确做法:在
httpd.conf或httpd-vhosts.conf的<virtualhost></virtualhost>或全局<directory></directory>块中添加 - 示例(加在
<directory></directory>内):Header always set X-Frame-Options "DENY"
- 不要用
append或merge:本地开发场景简单,set更确定;always是必须的,否则 404、304 响应不带该头
DENY 和 SAMEORIGIN 在本地开发中的实际差异
选哪个取决于你本地调试时是否需要 iframe 嵌套——比如用 iframe 加载子页面做组件预览。
-
DENY:任何 iframe 都拒载,包括http://localhost:8080/page.html嵌http://localhost:8080/widget.html——适合登录页、管理后台等敏感页 -
SAMEORIGIN:只允许同协议+同域名+同端口嵌套;http://localhost和http://127.0.0.1视为不同源,会拒绝 - 别用
ALLOW-FROM:Chrome 79+、Firefox 69+ 已彻底移除支持,本地测试也会失败
验证是否真生效,而不是只改了配置
改完配置重启 Apache 后,必须人工确认响应头真实存在,否则等于没设。
- 打开浏览器 DevTools → Network → 刷新页面 → 点开任意 HTML 请求 → Headers 标签页
- 查找 Response Headers 中是否有
X-Frame-Options: DENY(注意大小写和连字符,X-Frame-Option或x-frame-options都无效) - 如果没看到,检查是否漏启
mod_headers,或配置块没覆盖到你请求的路径(比如配在/api下,但你访问的是/index.html) - 本地开发不用管 CDN/WAF,但要注意:某些 PHP 框架(如 Laravel)或静态文件服务器(如 Live Server 插件)会覆盖响应头,优先级高于 Apache
最容易被忽略的是:XAMPP 默认不启用 .htaccess 解析,且 mod_headers 默认关闭——这两点不处理,其他配置全白搭。现代项目建议直接上 Content-Security-Policy: frame-ancestors 'none',但 XAMPP 的 Apache 对 CSP 的支持较弱,X-Frame-Options 仍是本地最稳妥的选择。










