apache通过将首个virtualhost设为拒绝响应的“拦截虚拟主机”来拒绝空或非法host头请求,需将其置于配置最前、绑定服务器ip、指向空目录并设置require all denied,后续真实站点配置须紧随其后且精确匹配。

Apache 中拒绝空主机头(即 Host 头为空或未匹配任何 ServerName 的请求),本质是利用虚拟主机的匹配机制,把“兜底流量”明确导向一个拒绝响应的配置。关键不是封 IP,而是控制 Host 头路由——只要请求没带合法 Host 或 Host 值不匹配任何 ServerName,就让它落到你预设的“拦截虚拟主机”里。
用第一个 VirtualHost 拦截所有未匹配请求
Apache 把配置文件中**第一个定义的
- 在 httpd-vhosts.conf 最顶部 添加一个监听 *:80 的 VirtualHost
- ServerName 设为服务器真实 IP(如 192.168.1.100),不能写 *、localhost 或留空
- DocumentRoot 指向一个空目录(例如 /var/www/denied 或 C:/xampp/htdocs/empty)
- 在对应
块中写 Require all denied
确保真实站点配置紧随其后且精确匹配
拦截配置之后,立刻写你真正的站点配置。顺序不能颠倒,否则拦截失效。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 第二个
写你的域名,如 ServerName example.com - 可加 ServerAlias www.example.com 覆盖常见别名
- DocumentRoot 设为实际项目路径
块内必须有 Require all granted
检查并关闭 NameVirtualHost(Apache 2.4+ 不需要)
Apache 2.4 及以后版本已废弃 NameVirtualHost 指令,若配置中还存在该行,需删除或注释掉,否则可能引发解析错误或虚拟主机失效。
- 打开 httpd.conf,搜索 NameVirtualHost
- 整行加上 # 注释,或直接删除
- 确认 Include conf/extra/httpd-vhosts.conf 已启用(去掉前面的 #)
验证空主机头是否真正被拒
测试时不要只输 IP,还要模拟空 Host 头或非法 Host 请求:
- 用 curl 测试:curl -H "Host:" http://your-server-ip(Host 为空)
- 或:curl -H "Host: evil.com" http://your-server-ip(Host 不匹配)
- 正常应返回 403 Forbidden,而不是首页或 404
- 浏览器直接访问 http://your-server-ip 也应被拦截(前提是 ServerName 写的是该 IP)









