必须用VirtualHost拦截IP访问:在httpd-vhosts.conf顶部配ServerName为真实IP的拒绝型虚拟主机(Require all denied),再配真实域名的允许型虚拟主机,顺序不可颠倒,且需确保Include启用、无NameVirtualHost指令。

禁止用户通过 IP 直接访问特定站点,本质是让 Apache 把所有未匹配到域名的请求(比如 http://192.168.1.100)拦截掉,而不是让它“掉进”你配置的第一个虚拟主机里。这靠的是 VirtualHost 的匹配顺序和兜底逻辑,不是防火墙或 IP 黑名单。
用默认拒绝型 VirtualHost 做兜底
Apache 会把 Host 请求头不匹配任何 ServerName 或 ServerAlias 的请求,交给第一个定义的 <VirtualHost>。所以关键是在真实站点配置之前,加一个“专拦 IP”的虚拟主机:
- 放在
httpd-vhosts.conf最顶部(必须在你的真实站点配置之前) -
ServerName写你服务器的真实 IP 地址(如192.168.1.100,不能写_、localhost或留空) -
DocumentRoot指向一个空目录(例如/var/www/denied) - 在对应的
<Directory>块中写Require all denied - 监听端口保持一致(如
*:80或*:443)
确保真实站点配置紧随其后
你的正常站点配置要立刻跟在这个拒绝型 VirtualHost 后面,且必须明确指定域名:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
ServerName必须是你实际使用的域名(如www.example.com),和 hosts 文件或 DNS 解析一致 -
ServerAlias可加 www 或其他别名(可选) -
DocumentRoot指向真实项目路径 -
<Directory>中写Require all granted - 同样监听
*:80(或*:443,HTTPS 需同步配证书)
检查关键配置项是否启用
很多问题出在基础设置没打开或冲突:
- 确认
httpd.conf中已启用Include conf/extra/httpd-vhosts.conf(取消注释) - 删除或注释掉所有
NameVirtualHost行(Apache 2.4+ 不需要,保留会导致异常) - 确保
Listen 80(和Listen 443)未被意外关闭 - 重启 Apache 后测试:
curl -H "Host: 192.168.1.100" http://192.168.1.100应返回 403;curl -H "Host: www.example.com" http://192.168.1.100应正常返回页面
HTTPS 站点也要单独处理
如果用了 SSL,*:443 的逻辑一样,但需额外提供证书:
- 在
httpd-vhosts.conf中靠前位置加一个<VirtualHost *:443> -
ServerName写你的公网 IP - 开启
SSLEngine on,并正确配置SSLCertificateFile和SSLCertificateKeyFile - 同样在
<Directory>或直接在 VirtualHost 内写Require all denied - 真实域名的 HTTPS 配置紧随其后,证书路径保持一致

















