root指令仅定义文件系统根路径,不具访问控制功能;真正实现禁止访问需结合location块与deny、internal等指令,并配合最小化root路径、系统权限收紧及敏感文件统一防护。

直接用 root 指令本身不能禁止访问,它只负责定义文件系统根路径;真正起防护作用的是 location 配合访问控制指令。关键在于:root 定义“从哪找文件”,而 location + deny / internal / auth 等才决定“哪些不给看”。
明确 root 路径边界,避免越界暴露
确保 root 设置在最小必要范围,不跨出业务目录。例如网站代码放在 /var/www/myapp,就设 root /var/www/myapp;,而不是更宽泛的 /var/www。否则像 /../etc/passwd 这类路径可能被利用(尽管 Nginx 默认防目录遍历,但显式加固更稳妥):
- 在 server 或 location 块中加:
location ~ \.\./ { return 403; } - 配合
root使用时,Nginx 实际拼接路径为root + URI,所以 root 越精确,拼错的风险越低
用 location 精准拦截敏感目录,不依赖 root
禁止访问不是靠改 root,而是靠独立的 location 规则匹配路径前缀或正则。常见做法:
- 禁止访问
/admin/:location ^~ /admin/ { deny all; }(^~提升匹配优先级,避免被其他正则覆盖) - 隐藏式屏蔽私有上传目录:
location ~ ^/uploads/private/ { internal; },外部请求直接 404,不暴露存在性 - 组合多个路径:
location ~ ^/(config|data|logs)/ { deny all; }
同步收紧文件系统权限,补上最后一道锁
即使 Nginx 配置了 deny all,如果目录权限是 755 且属主可写,仍可能被篡改或误传。必须配合系统层权限控制:
- 网站根目录(如
/var/www/myapp):属主root:nginx,权限755(Nginx 可读可进,不可写) - 上传目录(如
/var/www/myapp/uploads):属主nginx:nginx,权限750,并在对应 location 中禁用脚本执行:location ~ \.(php|sh|py)$ { deny all; } - 配置文件、SSL 私钥等:属主
root:root,权限600或640,确保 Nginx worker 进程无法直接读取
补充通用敏感文件防护,覆盖边缘情况
很多泄露源于 .env、.git、备份文件等被直接下载。这些和 root 无关,需统一在 http 或 server 块中加基础防护:
- 禁止所有隐藏文件:
location ~ /\. { return 404; } - 禁止敏感后缀:
location ~* \.(env|git|svn|htaccess|bak|log|sql|zip|tar\.gz)$ { return 403; } - 禁止目录列表(防止 autoindex 意外开启):
autoindex off;放在 server 或 location 中


















