DocumentRoot 安全需四层协同:路径隔离(如/srv/www/example.com/public)、Directory块内FilesMatch拦截敏感后缀、Options禁用Indexes/ExecCGI/Includes、系统权限设为750且属主非root。

DocumentRoot 本身不决定文件是否可下载,关键在于它对应的 <Directory> 区块如何限制访问行为。防止 .htaccess、.env、.git/config 等隐藏文件被恶意下载,必须组合路径隔离、权限控制、后缀拦截和选项禁用四层动作。
路径选择要干净独立
DocumentRoot 不应指向源码根目录或配置目录,避免隐藏文件天然暴露:
- ✅ 推荐路径如 /srv/www/example.com/public 或 /var/www/example.com,仅存放运行所需静态资源和入口脚本
- ❌ 禁止设为 /srv/www/example.com(含 .git/.env)、/home/user/project 或系统目录如 /etc、/root
- 确保该目录下不存在 .htaccess、.env、config.php、backup.sql 等敏感文件
Directory 块必须显式封堵敏感后缀
在 DocumentRoot 对应的 <Directory> 中,用 <FilesMatch> 精准拒绝常见隐藏文件请求:
使用 SoMark 将 PDF、图片(PNG/JPG/BMP/TIFF/WebP/HEIC)、Word、PPT 及其他文档解析为 Markdown 或 JSON,满足各类文档解析需求(如简历等)。
- 添加如下规则(放在
内部):
<FilesMatch "\.(htaccess|env|log|bak|swp|sql|yml|yaml|json|ini|git|svn|DS_Store)$">
Require all denied
</FilesMatch>
- 该规则优先级高于目录级 Allow/Require,能有效拦截直接 URL 访问(如 /robots.txt 不受影响,但 /.env 返回 403)
- 正则中包含点号需转义,结尾 $ 确保匹配完整后缀,防绕过
关闭高危选项与默认宽松行为
仅靠后缀拦截不够,还需从执行机制上切断下载可能:
- Options -Indexes -ExecCGI -Includes:禁用目录列表、CGI 执行和服务端包含,防止文件结构泄露或代码执行
- AllowOverride None:禁止 .htaccess 覆盖配置,避免攻击者上传恶意 .htaccess 绕过规则
- Require all denied 作为默认策略,再按需用 Require all granted 或 Require ip 显式放行,而非默认全开
操作系统层加固不可省略
Apache 进程无法读取的文件,根本不会进入 HTTP 处理流程:
- DocumentRoot 目录属主设为非 root 用户(如 www-data),组和其他用户无写权限:
chown -R www-data:www-data /srv/www/example.com/public
chmod -R 750 /srv/www/example.com/public - 特别检查上传目录、日志目录、配置目录是否被错误地放在 DocumentRoot 下——它们应完全分离,通过 Alias 或 PHP 后端代理访问

















