Apache控制虚拟主机访问权限的核心是为每个VirtualHost单独配置<Directory>块并用Require显式授权,路径须与DocumentRoot严格匹配,2.4+默认拒绝未声明权限的请求。

Apache 控制不同虚拟主机的访问权限,核心在于为每个 VirtualHost 单独配置 <Directory> 块,并在其中使用 Require 指令精确限定谁能访问该站点。不是靠全局设置,而是“一主一策”——每个站点的目录权限必须显式声明,否则默认拒绝(403 Forbidden)。
为每个虚拟主机单独写 <Directory> 块
Apache 2.4+ 不再继承父级目录权限,DocumentRoot 路径必须被 <Directory "路径"> 明确包裹,且内部必须包含访问控制指令。
-
Require all granted:允许所有 IP 访问(开发常用) -
Require ip 192.168.1.0/24:只允许内网段访问 -
Require local:仅本机(127.0.0.1 和 ::1)可访问 -
Require not host example.com:拒绝来自特定域名反向解析的请求(需 DNS 可查)
避免权限覆盖和误判
多个虚拟主机共存时,权限控制容易因路径重叠或指令遗漏失效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不要依赖全局
<Directory "/var/www">放行——它会被更具体的<Directory "/var/www/site-a">覆盖;而后者若没写Require,就等于禁止一切访问 - 确保每个
VirtualHost的<Directory>中的路径与DocumentRoot完全一致(末尾斜杠可选,但建议统一) - 若用
AllowOverride All启用 .htaccess,需确认该文件中未意外添加冲突的Require规则
结合 ServerName 实现差异化策略
同一 IP 上托管多个域名时,可利用 ServerName 区分站点,并为它们分配不同权限逻辑:
- 测试站
dev.site.local:允许所有内网 IP,Require ip 10.0.0.0/8 172.16.0.0/12 - 生产站
www.site.com:开放全球,但限制敏感路径,如后台入口:<Location "/admin"> Require ip 203.0.113.42 </Location> - 预发布站
staging.site.com:只允许可信运维 IP + 基本身份验证:Require ip 203.0.113.100 AuthType Basic ...
验证权限是否生效
配置完成后别直接刷新浏览器,先做三步验证:
- 运行
sudo apache2ctl -t(Debian/Ubuntu)或sudo httpd -t(CentOS/RHEL),确认语法无误 - 执行
sudo apache2ctl -S,检查目标域名是否出现在虚拟主机列表中,且port 80 namevhost标识正确 - 查看错误日志:
tail -f /var/log/apache2/error.log或/var/log/httpd/error_log,搜索client denied by server configuration,定位是哪条Require触发了拦截

















