Vue部署需确保publicPath、Vue Router base与Nginx alias三者路径严格对齐:publicPath设为'/admin/',router base设为'/admin/',Nginx用alias /opt/dist/并配置try_files $uri $uri/ /admin/index.html。

关键在于让 Vue 构建产物的资源路径、前端路由基地址、Nginx 实际文件位置三者严格对齐。错乱本质是路径映射断链,不是单纯改一个配置就能解决。
明确 publicPath 与部署路径一致
vue.config.js 中的 publicPath 必须设为子路径(含前后斜杠),例如部署在 /admin/ 下,就写:
publicPath: '/admin/'- 不能写成
'/admin'(缺末尾斜杠,CSS/JS 引用会变成/adminjs/app.js) - 也不能写成
'./'(相对路径,会导致刷新时资源加载失败)
Vue Router 的 base 必须同步
router 实例初始化时,base 值必须和 publicPath 完全一致:
const router = new VueRouter({ base: '/admin/', routes: [...] })- 否则点击链接跳转正常,但刷新页面时 Vue Router 无法识别当前路径,导致白屏或错误路由
Nginx 用 alias 而非 root 处理子路径
子路径部署推荐使用 alias,避免路径拼接歧义:
location /admin/ { alias /opt/dist/; try_files $uri $uri/ /admin/index.html; }- 注意:
alias后路径结尾必须带/,它会把/admin/整个匹配部分替换成目标目录 -
try_files的 fallback 路径要写成/admin/index.html,因为 Nginx 内部查找的是/opt/dist/index.html,而浏览器请求的是/admin/index.html
验证是否对齐的快速检查法
打开浏览器开发者工具,看 Network 面板中 JS/CSS 请求的 URL:
- 请求地址应为
https://example.com/admin/js/app.xxx.js - 响应状态码是 200,且响应内容确实是 JS 文件(不是 HTML)
- 直接访问
https://example.com/admin/和https://example.com/admin/user都能返回 index.html(说明 try_files 生效)











