Directory容器不能嵌套,因其是路径作用域容器而非逻辑分组标签;Apache按最长路径匹配原则选择生效块,需用平行独立的Directory块实现权限覆盖,并可配合FilesMatch进行文件级控制。

Directory 容器不能嵌套——这是 Apache 配置中一个关键但常被误解的点。你无法在 `
为什么不能嵌套?
Apache 的 `
例如,以下写法是非法的:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
Require all granted
<Directory "/var/www/site/uploads"> <!-- ❌ 错误:嵌套不被允许 -->
Require all denied
</Directory>
</Directory>
正确替代方案:独立声明 + 精确路径
要实现“主目录开放、子目录收紧”的效果,应单独定义两个平行的 `
- 先定义宽泛路径(如 `/var/www/site`),设基础权限
- 再定义更长、更精确的子路径(如 `/var/www/site/uploads`),其指令会自动覆盖前者
- Apache 总是选取**路径字符串最长的那个 `
` 块**来应用
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/var/www/site/uploads">
Options -Indexes
AllowOverride None
Require all denied
<FilesMatch "\.(php|pl|py|jsp|sh|cgi)$">
Require all denied
</FilesMatch>
</Directory>
配合 Files/FilesMatch 实现文件级控制
当需要限制特定类型文件(如禁止执行脚本),推荐在 `
- `
` 可出现在 ` ` 内,也可独立存在 - 正则匹配文件名(不依赖路径),适合统一拦截 `.ht*`、`.php` 等敏感后缀
- 示例:`
Require all denied ` 会拒绝所有 `.php` 文件访问
注意事项
确保路径与 `DocumentRoot` 严格一致,区分大小写;避免符号链接路径歧义;修改后务必运行 `apachectl -t` 验证语法,并用 `systemctl reload httpd` 生效。多目录块之间无继承关系,全靠路径长度和配置顺序决定最终行为。

















