必须用两个配合servername+require all denied实现ip封禁;因apache 2.4按顺序匹配虚拟主机,首段精确匹配ip并拒绝,次段才处理合法域名请求,单靠.htaccess或主配置无效。

直接结论:必须用两个 <virtualhost></virtualhost> 配合 ServerName + Require all denied 实现 IP 封禁,单靠 .htaccess 或改 httpd.conf 主配置无效。
为什么 Require local 改成 Require all granted 反而让 IP 能访问?
这是最常见的误解。Apache 2.4 的权限模型是「白名单优先」,Require local 是限制性规则,而 Require all granted 是放行所有——包括来自 192.168.x.x、10.x.x.x 甚至公网 IP 的请求。它解决的是「局域网无法访问」问题,和「禁止 IP 访问」目标完全相反。
真正起作用的,是 Apache 的虚拟主机匹配顺序:谁先匹配上,就用谁的配置。所以关键不是「怎么放行」,而是「怎么让 IP 请求掉进一个拒绝响应的虚拟主机里」。
- Apache 按配置文件中出现顺序匹配
<virtualhost></virtualhost>,第一个匹配成功的就生效 - 如果只配了一个
ServerName myproject.test的<virtualhost></virtualhost>,那么用 IP 访问时,Apache 会 fallback 到默认主机(通常是第一个定义的<virtualhost></virtualhost>) - 这个默认主机如果没有显式拒绝,就会返回
DocumentRoot下的内容(比如xampp/htdocs)
在 httpd-vhosts.conf 里加两个 <virtualhost></virtualhost>
打开 XAMPP\apache\conf\extra\httpd-vhosts.conf,在文件最开头插入以下两段(顺序不能错):
<virtualhost>
ServerName 192.168.1.100
<directory>
Require all denied
</directory></virtualhost><virtualhost>
ServerName myproject.test
DocumentRoot "X:/xampp/htdocs/myproject"
<directory>
Require all granted
AllowOverride All
</directory></virtualhost>
说明:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
-
ServerName 192.168.1.100必须是你本机实际的局域网 IP(用ipconfig或ifconfig查),不能写127.0.0.1或localhost,否则不生效 - 第一段
<virtualhost></virtualhost>不需要DocumentRoot,只要确保它排在前面,且ServerName精确匹配你用浏览器输的 IP 地址 - 第二段才是你的项目,
ServerName写域名,DocumentRoot和<directory></directory>路径必须一致 - Windows 路径中的反斜杠要写成正斜杠或双反斜杠,例如
"X:/xampp/htdocs/myproject"
别忘了改系统 hosts 文件
光配 Apache 不够,浏览器得知道 myproject.test 指向本机。编辑 C:\Windows\System32\drivers\etc\hosts(需管理员权限):
127.0.0.1 myproject.test
注意:
- 不要写成
192.168.1.100 myproject.test,否则本地开发时 Cookie 域名策略可能异常 - 如果同时想让局域网其他设备也能用域名访问,再加一行:
192.168.1.100 myproject.test,但仅限测试环境 - 改完 hosts 后,浏览器需清 DNS 缓存(
chrome://net-internals/#dns→ click «Clear host cache»)
重启 Apache 后仍能用 IP 访问?检查这三点
常见失效原因不是配置错,而是没触发匹配:
- 确认
httpd-vhosts.conf已被主配置加载:检查XAMPP\apache\conf\httpd.conf中是否包含Include "conf/extra/httpd-vhosts.conf"(默认已开启) - 确认 Apache 没用
httpd-xampp.conf覆盖了权限:该文件里有Deny from all,若启用,会导致所有请求 403,应注释掉相关段落 - 确认没有其他
<virtualhost></virtualhost>定义在别处(比如httpd.conf底部),它们可能抢在你配置前匹配成功
最稳妥的做法:把两个 <virtualhost></virtualhost> 块放在 httpd-vhosts.conf 最开头,并删掉文件里其他示例配置(如 www.example.com),避免干扰。










