documentroot 安全需构建三层控制:路径隔离(如/srv/www/example.com/public)、目录权限收紧(755/644,非root属主)、apache指令严格限制(-indexes、allowoverride none、require all denied),并配合filesmatch拦截敏感文件及上传目录单独加固。

DocumentRoot 本身不防目录遍历,但配置不当会直接放大风险。关键不是“怎么设路径”,而是围绕它构建三层控制:路径选得干净、目录权限收得紧、Apache 指令关得严。
路径选择要隔离,不碰敏感区
别用 /var/www/html 这类默认路径,除非你全程管控其权限;更不能指向项目源码根目录(如 /srv/myapp),否则 .env、config.php、.git/config 都可能被直接下载。
- 推荐路径:/srv/www/example.com/public 或 /opt/webroot/appname
- 确保该路径与系统目录(/etc、/home、/root)物理隔离
- DocumentRoot 必须只指向静态入口目录——ThinkPHP/Laravel 的 public/,不是整个项目目录
Directory 块必须配对写,禁用高危行为
只改 DocumentRoot 不起作用。必须在对应
- Options -Indexes +FollowSymLinks:禁目录列表,保留软链支持(避免路由失效)
- AllowOverride None:禁止 .htaccess 覆盖,防止分散式配置引入漏洞
- Require all denied:默认全拒,再按需用 Require ip 或 Require local 精确放行
- 若用 PHP,额外加 Options -Includes -ExecCGI,禁用 SSI 和 CGI 执行
拦截敏感文件请求,堵住绕过路径
攻击者常跳过目录页,直接请求 .git/config、backup.sql、phpinfo.php。在 VirtualHost 或主配置里加:
Require all denied
- 对上传目录(如 /uploads/)单独加固:
Require all denied Options None - 配合 mod_security 规则,拦截含 ../、%2e%2e%2f 的请求路径
权限与运行用户要匹配
路径再安全,权限松了也白搭:
- 目录属主设为非 root 用户(如 www-data 或自建 webuser):chown -R webuser:www-data /srv/www/example.com/public
- 权限设为 755(目录)和 644(文件),组和其他用户无写权限
- 确认 Apache 运行用户(APACHE_RUN_USER)与目录属主一致,否则 403 是静默拒绝











