Nginx 的 root 指令必须使用绝对路径,不支持相对路径;因 root 不基于配置文件位置或工作目录解析路径,误用 ./ 或 html 会导致 404/403;应写如 root /var/www/my-site; 并验证目录权限与存在性。

Nginx 的 root 指令不支持相对路径,必须写绝对路径。你写 root ./dist; 或 root ../html; 这类写法,Nginx 会直接报错或静默失败——它根本不会按当前配置文件位置去“推算”真实路径,而是当作字面字符串拼接,最终导致找不到文件、404 或 403。
为什么相对路径无效
Nginx 启动时以自身工作目录(通常是 /usr/local/nginx 或 /var/lib/nginx)为基准,但 root 指令从不基于该工作目录解析相对路径。它只认以 / 开头的完整路径。比如:
- 你误写:
root ./myapp;→ Nginx 尝试打开./myapp/index.html,而这个./指向的是 Nginx 主进程的工作目录,几乎肯定不是你的项目目录; - 你写:
root html;→ 它会去找/html/(根目录下的 html 文件夹),而不是配置文件同级的 html 目录。
正确写法:一律用绝对路径
把项目目录的完整路径写死,例如:
root /home/user/myproject/dist;root /var/www/my-site;root /opt/app/frontend;
确认这个路径下确实存在 index.html(或你期望的入口文件),且 Nginx 进程用户(如 www-data 或 nginx)对该目录和文件有读取权限(ls -l /path/to/dir 查看)。
怎么快速确认路径是否写对
别靠猜,用这三步验证:
- 在终端执行
ls -l /你写的绝对路径,看目录是否存在、是否可读; - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,访问时它会明确打印“open() ‘/xxx/yyy.html’ failed (2: No such file or directory)”——这就是真实查找路径; - 运行
sudo nginx -t确保语法无误,再sudo systemctl reload nginx生效。
不想硬编码?用变量也不行
Nginx 原生不支持在 root 中使用变量(如 $document_root 或自定义变量)。若真需动态路径,只能通过外部脚本生成配置,或改用 alias + 环境变量间接实现(较复杂,一般没必要)。日常部署,老老实实写绝对路径最稳。


















