应优先用alias,因root会将location路径原样拼接导致404(如请求/admin/index.html查找/opt/dist/admin/index.html),而alias精准替换前缀(/admin/→/opt/dist/),配合publicpath设为'/admin/'和try_files兜底,确保spa子目录部署正常。

项目部署到子目录(比如 https://example.com/admin/)时,root 不是首选方案,**应优先用 alias**。因为 root 会把 location 路径原样拼接进去,容易导致路径错位、静态资源 404 或白屏;而 alias 能精准替换匹配前缀,语义清晰、行为可控。
为什么 root 在子目录场景容易出错
root 的逻辑是:「请求路径 = root 目录 + 完整 URI」。例如:
- 配置:
location /admin/ { root /opt/dist; } - 访问
/admin/index.html→ Nginx 实际查找/opt/dist/admin/index.html - 但 Vue 打包后文件都在
/opt/dist/下,没有admin/子目录 → 404
除非你手动把整个 dist 内容挪进 /opt/dist/admin/,否则这条路走不通。
正确做法:用 alias 精准映射
alias 会把匹配的 location 前缀完全替换为目标路径,适合子目录部署:
- 确保
vue.config.js中publicPath设为'/admin/'(结尾斜杠不能少) - Nginx 配置写成:
location /admin/ { alias /opt/dist/; try_files $uri $uri/ /admin/index.html; } - 注意:
alias后的路径必须以/结尾,否则会拼接错误 - 访问
/admin/xxx.js→ 直接读取/opt/dist/xxx.js,不带多余层级
配套要点不能漏
光配对 alias 还不够,三个环节必须一致:
-
构建路径:Vue 打包输出目录(如
/opt/dist)要和alias指向的物理路径完全一致 -
资源引用前缀:publicPath 必须与 URL 子路径严格匹配(
/admin/→ 生成的js/css链接自动带/admin/前缀) -
SPA 路由兜底:
try_files $uri $uri/ /admin/index.html中的/admin/index.html是相对 URL,对应alias下的index.html
验证是否生效的小技巧
部署后快速检查三件事:
- 直接请求
https://example.com/admin/index.html→ 应返回 HTML 内容(不是 404) - 查看页面源码,确认
js和css的src/href地址以/admin/开头 - 刷新任意子路由(如
/admin/user)→ 页面不报 404,Vue Router 正常接管











