Directory块采用最长前缀精确匹配,不继承;Apache按请求路径逐级向上拆解,取字符数最长的完全匹配项,仅作用于当前VirtualHost的DocumentRoot子路径。
directory 块不继承,只匹配——它不是父子传递的配置树,而是由 apache 在请求路径解析阶段做“最长精确匹配”的独立规则块。
匹配逻辑:路径字符串的最长前缀匹配
Apache 把每个请求的 URL 路径(经 DocumentRoot 映射后转为文件系统绝对路径)逐级向上拆解,从最深目录开始,依次尝试匹配所有已定义的
- 请求 /var/www/html/blog/post.php,Apache 会按顺序检查:
/var/www/html/blog/post.php → /var/www/html/blog → /var/www/html → /var/www → /var → / - 只要某个路径字符串与
中声明的路径**完全一致**(注意:必须是绝对路径,且末尾斜杠可省略),就命中该块;
多个匹配时,取**字符数最长的那个**,即最具体的目录优先。 - 没有“父块默认生效、子块叠加覆盖”的继承关系;未匹配到的路径,回退到全局或虚拟主机默认设置。
作用域边界:严格绑定 VirtualHost + DocumentRoot
- 错误示例:
<VirtualHost *:80><br> DocumentRoot /var/www/site-a<br> <Directory /var/www/site-b>...</Directory><br> </VirtualHost>
此处 /var/www/site-b 不在当前虚拟主机作用范围内,Apache 启动时会报错或静默忽略。 - 正确写法必须路径对齐:
<Directory /var/www/site-a/uploads>✅
配置生效时机:仅影响新派生的子进程
修改 sudo systemctl reload apache2(或 httpd -k graceful),父进程校验语法无误后,会通知旧子进程完成当前请求后退出,并启动一批加载了新配置的新子进程。
- 正在处理请求的旧子进程仍按旧
规则执行,直到自然退出; - 新子进程从启动起就使用更新后的匹配结果和指令(如 Require、Options);
- 这意味着权限变更**不实时中断已有连接**,但新请求立即走新规则。
与 .htaccess 的本质区别
AllowOverride 控制。
- 若
已设 AllowOverride None,.htaccess 完全不被读取; - 若设为
All或指定指令类型,则 Apache 会在匹配到的目录及其父目录中搜索 .htaccess,并按找到的最近一个生效——这层查找才是真正的“向上继承”,但和块之间无继承关系。


















