核心是嵌套在VirtualHost内的Directory块,用绝对路径绑定目录并按功能施加最小权限:公开目录启用FollowSymLinks、禁Indexes、AllowOverride All、Require all granted;上传目录用FilesMatch禁止脚本执行;后台目录限制IP或认证;多目录按最长路径匹配,修改后需configtest验证并reload服务。

ServerName 本身不参与权限控制,它只用于虚拟主机识别和 Host 头匹配。真正实现“嵌套目录精细化权限控制”的核心是 <Directory> 指令块,必须配合 ServerName 所属的 <VirtualHost> 使用,且路径需基于该虚拟主机的 DocumentRoot。
关键不是 ServerName 怎么写,而是如何在它的上下文中精准绑定目录路径并施加多层控制。
Directory 块必须嵌套在 VirtualHost 内,路径用绝对路径
每个 <Directory> 只对当前 <VirtualHost> 生效,且路径必须是文件系统绝对路径,与 DocumentRoot 对齐。例如:
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/example"
<Directory "/var/www/example/admin">
Require group admins
Options -Indexes -ExecCGI
AllowOverride None
</Directory>
<Directory "/var/www/example/uploads">
Require all granted
<FilesMatch "\.(php|pl|py|sh|cgi)$">
Require all denied
</FilesMatch>
</Directory>
</VirtualHost>-
/admin目录仅允许admins组成员访问,禁列目录、禁执行脚本 -
/uploads允许所有人读取,但明确拒绝所有脚本文件执行
按嵌套深度逐级收口,避免权限继承失控
Apache 的 <Directory> 匹配按最长路径优先原则生效,所以子目录规则会覆盖父目录规则。例如:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<Directory "/var/www/example">
Require all granted
</Directory>
<Directory "/var/www/example/api">
Require valid-user
<LimitExcept GET HEAD OPTIONS>
Require group api-writers
</LimitExcept>
</Directory>- 根目录开放,但
/api下所有非 GET/HEAD/OPTIONS 请求(如 POST/PUT)必须属于api-writers组 -
LimitExcept是动作级控制,必须和Require配合才生效,单独写无效
结合 RequireAll/RequireAny 实现逻辑组合
敏感路径常需多重条件,比如“内网 IP + 登录用户 + 特定组”:
<Directory "/var/www/example/internal">
<RequireAll>
Require ip 192.168.1.0/24
Require group internal-team
Require ssl-recommended
</RequireAll>
</Directory>- 三个条件必须同时满足,缺一不可
-
ssl-recommended是环境变量或自定义条件,可配合SetEnvIf或mod_ssl使用
同步校验系统权限,否则配置无效
Apache 进程(如 apache 或 www-data 用户)必须对目标目录有基本读取权限:
- 目录权限建议
755,属主属组设为 Apache 运行用户 -
.htpasswd和.htgroup文件权限必须644,确保 Apache 能读取 - 若启用 SELinux,需打标:
chcon -t httpd_sys_content_t /var/www/example
不复杂但容易忽略

















