子目录的规则不继承父目录配置,Apache对每个请求路径独立执行最长前缀精确匹配,必须显式定义绝对路径块(如"/var/www/html/blog/admin"),且所有权限、Options等需重新声明。
为子目录配置独立的 <directory></directory> 规则,核心在于**路径精确匹配、不继承、层级无关**。apache 不会把父目录的配置“传给”子目录,而是对每个请求路径做一次独立的最长前缀匹配——所以子目录必须显式定义自己的 <directory></directory> 块,且路径要写准。
路径必须是绝对文件系统路径
Apache 匹配的是 DocumentRoot 映射后的实际磁盘路径,不是 URL 路径。例如:
- 若
DocumentRoot "/var/www/html",想限制http://example.com/blog/admin,对应目录块应写<directory></directory> - 末尾斜杠可省略,
/var/www/html/blog/admin和/var/www/html/blog/admin/效果相同 - 路径区分大小写(Linux 系统),
/Blog和/blog是两个不同路径
子目录规则完全独立,不叠加父目录
即使你已配置了 <directory></directory>,它对 /var/www/html/blog 也**不生效**。Apache 只取匹配中字符数最长的那个块——只要存在 <directory></directory>,就只用它,不会合并或继承上级配置。
- 这意味着:子目录权限、访问控制、Options、AllowOverride 等全部需重新声明
- 常见误区:以为在父目录设了
Require all denied,子目录就自动被锁住——实际不会,必须单独写 - 若子目录没定义任何
<directory></directory>,则回退到最近的匹配块(可能是更上层目录,或全局默认)
典型配置示例(Apache 2.4+)
比如限制后台目录仅限内网访问,同时允许根目录公开浏览:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<Directory "/var/www/html"><br> Require all granted<br></Directory>
<Directory "/var/www/html/admin"><br> Require all denied<br> Require ip 192.168.0.0/16<br> Require ip 127.0.0.1<br></Directory>
注意:Require all denied 必须放在子目录块第一行,否则未明确拒绝的请求可能因匹配不到而落到上级规则,造成意外放行。
配套设置不能漏
光写 <directory></directory> 不够,还需确认:
-
AllowOverride None:防止子目录下.htaccess绕过你的限制(除非你明确需要它) - 模块已启用:确保
mod_authz_host(用于 Require)和mod_access_compat(如需兼容旧语法)已加载 - 前置代理场景:如果用了 CDN 或 Nginx 反代,要配
RemoteIPHeader X-Forwarded-For并启用mod_remoteip,否则Require ip判的是代理 IP

















