root 指令通过路径拼接定位静态资源,而非替换;托管 spa 必须配合 try_files $uri $uri/ /index.html 实现前端路由兜底,常见错误包括 root 末尾多斜杠、与 alias 混用、路径层级错配及缺失 mime 类型与缓存配置。

用 root 指令托管静态资源,核心是让 Nginx 知道“文件放在哪”,然后它自动把请求路径拼上去找。配对不难,但路径逻辑容易错,尤其在部署 SPA 或多级子路径时。
root 的真实行为:拼接,不是替换
root 不会丢掉 location 中的路径前缀,而是原样拼到你指定的目录后面。
- 配置:location /assets/ { root /var/www; }
- 请求:/assets/logo.png
- Nginx 实际查找:/var/www/assets/logo.png
这意味着 /var/www 下必须真实存在 assets/ 这个子目录。root 值末尾不要加斜杠(如 /var/www/),Nginx 会自行处理,多加可能引发双斜杠问题。
托管单页应用(SPA)的关键补丁:try_files
只写 root 不够。SPA 的前端路由(比如 /user/profile)在磁盘上没有对应文件,直接访问会 404。必须靠 try_files 做兜底:
- $uri:先找真实文件(如 /js/app.js)
- $uri/:再找同名目录(如 /static/)
- /index.html:全部失败后,内部重写为 /index.html,由前端路由接管
示例配置:
location / {root /var/www/my-spa;
try_files $uri $uri/ /index.html;
}
常见翻车点和应对
- root 和 alias 混用:root 是拼接,alias 是替换。别在同一个 location 里来回切;想映射 /api-docs/ 到某个固定目录,就用 alias,别硬套 root
- location 路径嵌套错误:比如构建产物在 /var/www/my-spa/dist,却写 root /var/www/my-spa/dist,那访问 /css/main.css 就会去找 /var/www/my-spa/dist/css/main.css —— 正确做法是 root /var/www/my-spa,再用 location 精准控制
- MIME 类型与缓存没设:加上 include /etc/nginx/mime.types; 和 gzip on;;HTML 文件建议禁用缓存:location = /index.html { add_header Cache-Control "no-cache"; }
验证是否生效
- 运行 nginx -t 确认语法无误
- 用 curl -I http://localhost/about 查状态码和 Content-Type
- 浏览器打开一个前端路由地址(如 /admin),刷新后页面能正常渲染,说明 fallback 成功
- Network 面板检查 JS/CSS 是否 200 加载,无 404











