Apache 如何限制特定 IP 地址访问指定目录安全配置

文章导读
Apache 2.4 及以上版本限制特定 IP 访问指定目录,必须在配置文件的<Directory>块中使用 Require 指令,严禁混用旧版 Order/Deny 语法以免服务启动失败。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

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 格式:

Apache 如何限制特定 IP 地址访问指定目录安全配置
Require ip 192.168.1.0/24

为什么会这样

Apache 2.4 重构了授权机制,mod_authz_host 模块不再支持旧版 Order 指令。直接沿用 2.2 写法会导致 Invalid command 'Order' 错误或服务启动失败。Require 指令采用白名单优先逻辑,多条规则默认为“或”关系,需显式声明默认拒绝策略。

分步处理

  1. 定位配置文件:Linux 系统通常位于/etc/apache2/apache2.conf 或/etc/httpd/conf/httpd.conf,虚拟主机配置在 sites-available 目录。
  2. 编辑目录块:找到目标目录对应的<Directory>块,若无则新建,路径需与 DocumentRoot 或实际路径完全一致。
  3. 写入控制指令:先写 Require all denied 设定默认拒绝,再写 Require ip 添加例外允许列表。
  4. 检查语法:执行 apachectl configtest 或 apache2ctl configtest,确保输出 Syntax OK。
  5. 重载服务:运行 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 权限。

Apache 如何限制特定 IP 地址访问指定目录安全配置

常见坑

  • 锁死本机访问:配置 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 实际加载的主配置文件。