宝塔面板单域名部署多个 Vue 项目:从路径冲突到完美共存


宝塔面板单域名部署多个 Vue 项目:从路径冲突到完美共存

在服务器运维中,我们经常遇到这样的需求:只有一个域名,但需要同时部署主站管理后台移动端项目 ,甚至还有一个 Node.js 后端

很多开发者在配置时会遇到"静态资源 404"、"刷新页面 404"或"Nginx 配置文件冲突"的问题。今天,我就以实战经验教大家如何一站式解决这些痛点。

一、 核心逻辑:路径分流

我们的目标是通过不同的 URL 后缀来访问不同的项目:

  • exam.com/ -> 访问 Web 主项目
  • exam.com/web -> 访问 Web 镜像/备份
  • exam.com/auth -> 访问 授权/认证项目
  • exam.com/api` -> 转发到 Node.js 后端服务

二、 前端配置(打包前的关键)

Vue 是单页面应用(SPA),在子目录下运行必须修改"基准路径"。

1. 修改 router/index.js

在创建路由实例时,指定 base 路径:

javascript 复制代码
const router = createRouter({
  history: createWebHistory('/auth/'), // 根据子目录名修改
  routes,
});

2. 修改打包配置

  • Vite : 在 vite.config.ts 中设置 base: '/auth/'
  • Vue CLI : 在 vue.config.js 中设置 publicPath: '/auth/'

三、 Nginx 配置:解决"多胞胎"冲突

在宝塔面板中,手动修改【网站设置】->【配置文件】。

1. 解决 duplicate location "/" 错误

这是最常见的错误。如果你开启了宝塔的"反向代理",宝塔会自动生成一个 location /。如果你在配置文件里又写了一个,Nginx 就会报错。

解决方案:

将 Node.js 后端的代理目录改为 /api(在宝塔反向代理界面修改),并在主配置文件中删除或注释掉多余的根路径配置。

2. 完美的 Nginx 配置文件参考

nginx 复制代码
server {
    listen 80;
    server_name yourdomain.com;

    # --- 1. 根目录:部署主项目 ---
    location / {
        root /www/wwwroot/dist/web; # 指向 web 项目
        index index.html;
        try_files $uri $uri/ /index.html; # 解决 History 模式刷新 404
    }

    # --- 2. 子目录项目:使用 alias 而非 root ---
    location /auth {
        alias /www/wwwroot/dist/auth/; # 末尾必须带斜杠
        index index.html;
        try_files $uri $uri/ /auth/index.html; # 注意这里的路径包含前缀
    }

    # --- 3. 后端 API 转发 ---
    # 建议通过宝塔自带的反向代理配置,但代理目录要设为 /api
    include /www/server/panel/vhost/nginx/proxy/yourdomain/*.conf;
}

四、 避坑指南(Q&A)

Q:为什么页面显示出来了,但 CSS/JS 文件报 404?
A: 这是因为打包时的 base 路径没设置对。检查 dist/index.html 里的资源引用路径,如果显示的是 <script src="/js/app.js">,那在子目录下肯定找不到。它应该是 <script src="/auth/js/app.js">

Q:刷新页面就显示 404 怎么回事?
A: 这是 Vue History 模式的特性。Nginx 找不到这个虚拟路径的文件。必须配置 try_files,让所有请求都 fallback 到 index.html

Q:配置保存失败,提示配置错误?
A: 检查大括号 {} 是否闭合,检查每一行是否以分号 ; 结尾。最重要的是,全局搜索是否出现了两个 location /


五、 总结

单域名多项目部署的核心在于:前端改 base,后端改 alias,API 加前缀。只要理清了 Nginx 的路径匹配逻辑,再复杂的项目结构也能轻松驾驭。


相关推荐
林恒smileZAZ5 小时前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript
濮水大叔6 小时前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
范什么特西7 小时前
网络代理问题
java·linux·服务器
laowang3577 小时前
依赖故障时,日志体系需要埋哪些关键节点才能快速定位是安装失败、解析失败还是运行时缺失?
前端·javascript·vue.js·webpack·node.js
utf8mb4安全女神7 小时前
【Redis数据库】哨兵集群/redis集群/安装配置/主从复制/数据持久化操作/数据结构/安全限制/PHP redis/
linux·服务器·数据结构·数据库·redis·缓存
Let's Chat Coding8 小时前
对称密钥认证:主机和设备共享同一把密钥
运维·服务器·网络
写代码的学渣8 小时前
Linux 安装 Swap 交换分区大小标准(通用 + 生产服务器 + 个人 PC)
linux·运维·服务器
༄沐࿆风࿆࿆9 小时前
JavaScript函数完全指南:从基础语法到闭包原理与应用实战
开发语言·javascript
fei_sun9 小时前
ARP(地址解析协议)与NDP(邻居发现协议)
运维·服务器
finyouIT9 小时前
锚点实现了点击导航平滑滚动到页面指定位置的三种方法
javascript·css