Apache 2.4 及以上版本限制特定 IP 访问指定目录,必须在配置文件的<Directory>块中使用 Require 指令,严禁混用旧版 Order/Deny 语法以免服务启动失败。
先说结论:Apache 2.4+ 废弃了 Order/Allow/Deny,必须使用 Require ip 配合 Require all denied 实现精准控制,配置后需重启服务并验证 403 状态码。
- 适合场景:Apache 2.4+ 环境,需限制后台目录、敏感文件或特定网段访问。
- 优先准备:备份 httpd.conf 或虚拟主机配置文件,确认当前 Apache 版本。
- 验收标准:被禁 IP 访问返回 403 Forbidden,允许 IP 访问正常,日志无语法错误。
命令速用版
以下配置片段可直接放入 httpd.conf 或虚拟主机配置文件的<Directory>块中,实现仅允许特定 IP 访问。
<Directory "/var/www/html/restricted">
Require all denied
Require ip 192.168.1.100
Require ip 192.168.1.101
</Directory>若需允许整个网段,使用 CIDR 格式:
Require ip 192.168.1.0/24
为什么会这样
Apache 2.4 重构了授权机制,mod_authz_host 模块不再支持旧版 Order 指令。直接沿用 2.2 写法会导致 Invalid command 'Order' 错误或服务启动失败。Require 指令采用白名单优先逻辑,多条规则默认为“或”关系,需显式声明默认拒绝策略。
分步处理
- 定位配置文件:Linux 系统通常位于/etc/apache2/apache2.conf 或/etc/httpd/conf/httpd.conf,虚拟主机配置在 sites-available 目录。
- 编辑目录块:找到目标目录对应的<Directory>块,若无则新建,路径需与 DocumentRoot 或实际路径完全一致。
- 写入控制指令:先写 Require all denied 设定默认拒绝,再写 Require ip 添加例外允许列表。
- 检查语法:执行 apachectl configtest 或 apache2ctl configtest,确保输出 Syntax OK。
- 重载服务:运行 systemctl reload apache2 或 systemctl reload httpd 使配置生效。
怎么验证是否生效
配置完成后需从不同网络环境测试访问结果。使用 curl 命令检查 HTTP 状态码,被禁 IP 应返回 403,允许 IP 返回 200。查看错误日志/etc/apache2/error.log 或/var/log/httpd/error_log,确认无 AH01630 client denied 以外的语法报错。若使用.htaccess,需确认 AllowOverride 已开启 AuthConfig 或 Limit 权限。
常见坑
- 锁死本机访问:配置 Require all denied 后若未添加 Require ip 127.0.0.1,本地测试也会被拒绝。
- IPv6 格式错误:IPv6 地址必须带前缀长度,如 Require ip 2001:db8::/32,省略会导致匹配失败。
- 配置被覆盖:若目录存在.htaccess 文件且允许覆盖,其中的授权规则可能优先级更高,需检查 AllowOverride 设置。
- 逻辑冲突:RequireAll 容器内同时写允许和拒绝规则可能导致全部拒绝,简单场景建议直接用多条 Require 指令。
常见问题
配置后 Apache 启动报错怎么办
检查是否混用了 Order/Deny 指令,Apache 2.4 默认不加载 mod_access_compat 模块,必须改用 Require 语法。
如何禁止特定 IP 而不是允许特定 IP
使用 Require not ip 192.168.1.100 指令,但需配合 Require all granted 使用,注意逻辑优先级避免失效。
为什么修改了配置但没有生效
确认是否执行了重载命令,检查修改的配置文件是否为当前 Apache 实际加载的主配置文件。