xampp 默认不发送 x-download-options 响应头,需在对应 virtualhost 块中手动添加 header set x-download-options "noopen" 并确保 mod_headers 已启用、httpd-vhosts.conf 被加载、端口监听正常且 header 指令位于有效作用域内。

直接说结论:XAMPP 默认不发送 X-Download-Options 响应头,必须手动在 Apache 配置中显式添加;多端口配置本身不影响该头的设置,但每个 <virtualhost></virtualhost> 块需单独配置,否则只对默认端口生效。
为什么浏览器仍提示“已阻止下载”?
这是 IE/Edge 旧版(尤其是企业环境)对可执行文件(.exe、.msi 等)的主动拦截行为,依赖 X-Download-Options: noopen 头来禁用内联打开、强制保存。Apache 不自带该头,XAMPP 也未预设 —— 即使你开了 8080、8081 多端口,只要没加这行,下载依然被拦。
- 常见现象:
http://localhost:8080/installer.exe点击后弹出“已阻止下载”,控制台无报错,Network 标签里响应头里找不到X-Download-Options - 注意:该头仅对 IE/Edge Legacy 有效,Chrome/Firefox 忽略它;别误以为加了就能解决所有浏览器的下载限制
- 它和
Content-Disposition: attachment不同:后者控制是否弹保存框,前者专治 IE 的“自动打开危险文件”逻辑
在 httpd-vhosts.conf 中为指定端口添加响应头
不能只在全局 httpd.conf 里加,因为 Header set 指令在非模块启用或未加载 mod_headers 时会报错;更关键的是,多端口场景下,你往往只想对某个端口(比如仅 :8080 提供安装包)启用该头,而非所有站点。
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
- 确认
mod_headers已启用:打开D: mpppacheconfhttpd.conf,确保这行没被注释:LoadModule headers_module modules/mod_headers.so - 在对应
<virtualhost></virtualhost>块内部、之后添加:
Header set X-Download-Options "noopen"
- 如果还想同时禁用 MIME 类型嗅探(增强防护),可追加:
Header set X-Content-Type-Options "nosniff" - 不要写成
Header always set——set已足够,always在某些 Apache 版本下会导致重复头或 500 错误
重启后仍不生效?检查三个硬性条件
多端口 + 自定义 Header 是组合配置,漏掉任意一环都会失败。最容易忽略的是权限与上下文范围。
-
httpd-vhosts.conf是否真正被加载?检查httpd.conf中这行是否取消注释:Include conf/extra/httpd-vhosts.conf -
<virtualhost></virtualhost>块里是否漏了<directory></directory>权限段?没有它,Apache 可能拒绝执行Header指令,尤其在 Windows 下默认 deny all - 端口是否真被监听?运行
netstat -ano | findstr :8080,确认 PID 对应的是httpd.exe,而不是 Skype、Zoom 或其他占端口程序
最常被跳过的细节:Header 指令必须出现在有作用域的容器内(如 <virtualhost></virtualhost> 或 <directory></directory>),不能裸写在配置文件顶层;且 Windows 下路径分隔符用正斜杠 / 或双反斜杠 \,单反斜杠会引发解析错误。配完别急着测浏览器,先用 curl -I http://localhost:8080/test.php 看响应头是否含 X-Download-Options —— 这步省掉,后面全白调。










