apache 2.4+中彻底禁止特定ip须用require not ip置于virtualhost或location块内,配合require all granted生效,不可嵌套于directory、禁用旧语法,且需重启服务验证403响应。

在 Apache 中彻底禁止特定 IP 地址的访问,关键在于在请求处理链最早、最权威的位置生效,避免被下层配置覆盖或绕过。推荐优先使用服务器级配置(httpd.conf 或虚拟主机配置),并配合 Require not ip(Apache 2.4+)实现精准、不可绕过的拦截。
用 Require not ip 在虚拟主机中全局封禁
这是最推荐、最可靠的方式,适用于拥有服务器管理权限的用户:
- 编辑对应站点的虚拟主机配置文件(如
/etc/apache2/sites-available/your-site.conf或/etc/httpd/conf.d/vhost.conf) - 在
<virtualhost></virtualhost>或<virtualhost></virtualhost>块内添加如下内容(注意:必须放在DocumentRoot同级或更外层,不要嵌套在<directory></directory>内):
ServerName example.com
DocumentRoot /var/www/html
# 全局拒绝指定IP,所有路径均生效
Require all granted
Require not ip 203.0.113.55
Require not ip 198.51.100.0/24
- 保存后执行
sudo systemctl reload apache2(Debian/Ubuntu)或sudo systemctl reload httpd(RHEL/CentOS) - 该规则在请求路由阶段即触发,不依赖目录路径,无法被 .htaccess 覆盖
用 <location></location> 统一拦截根路径
若需确保连 favicon.ico、robots.txt 等静态资源也一并拦截,可强制作用于整个 URL 空间:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 在虚拟主机配置中加入:
Require all granted
Require not ip 192.0.2.100
- 此方式比
<directory></directory>更底层——它按 URL 匹配,不依赖文件系统路径,也不受AllowOverride影响 - 特别适合防止攻击者通过构造特殊路径(如
/wp-admin/.htaccess)试探绕过
避免常见失效陷阱
很多“看似封了却仍能访问”的问题,源于配置位置或语法错误:
-
别只改 .htaccess:它可被上层
AllowOverride None禁用;即使启用,也可能被其他 .htaccess 覆盖或继承冲突 -
别混用旧语法:Apache 2.4+ 已弃用
Order/Deny/Allow,若同时存在新旧指令,可能因模块加载顺序导致行为异常 -
注意代理环境:如果网站前有 CDN 或负载均衡器,客户端真实 IP 在
X-Forwarded-For头里,需先启用mod_remoteip并配置RemoteIPHeader,否则Require not ip判定的是代理 IP -
拒绝后不返回 403 就是没生效:用
curl -I http://yoursite.com -H "Host: example.com"测试,并检查响应头中的Status: 403 Forbidden
进阶:结合日志自动封禁(可选)
对高频恶意 IP,可配合 fail2ban 实现动态封禁:
- 配置 fail2ban 的 jail,监控 Apache access.log 中的异常请求(如大量 404、扫描路径)
- 动作脚本调用
iptables或写入 Apache 的block-ip.conf并重载服务 - 这种方式不依赖 Apache 自身规则,属于网络层拦截,更彻底









