RuoYi-Vue 非根目录部署:从环境变量到Nginx配置的完整避坑指南 📅 发布时间:2026/7/15 8:16:19 👁️ 浏览次数: 1. 为什么非根目录部署会出问题第一次尝试把RuoYi-Vue部署到/admin/路径下时我遇到了刷新页面就404的尴尬情况。这其实是SPA应用在History路由模式下的经典问题当用户直接访问/admin/system/user这样的子路由时Nginx会把这个路径当作真实存在的文件路径去查找而实际上这些路由是由前端Vue Router控制的虚拟路径。核心矛盾点在于静态资源路径错乱打包后的js/css文件默认从根目录加载部署到子目录后找不到资源路由匹配失效Nginx没有把非根路径的请求正确转发给index.htmlAPI请求路径错误前端请求的API地址仍然从根目录发出我曾在测试环境用Hash模式带#的路由临时解决问题但实际项目必须用History模式。后来发现需要同时修改以下四个位置的配置才能完美解决2. 前端环境变量配置在项目根目录的.env.production文件中增加基础路径配置其他环境文件也需要同步修改# 生产环境配置 VUE_APP_BASE_URL /admin/这个变量会影响到三个关键位置静态资源加载路径通过vue.config.js中的publicPath配置路由基础路径在router/index.js中设置base参数请求路径拼接在utils/request.js中修正API请求地址实测发现如果只改其中一两处会出现各种诡异问题。比如我最初漏改了request.js结果登录成功后页面直接白屏控制台报错找不到JS文件。3. Vue项目配置调整3.1 修改vue.config.jsmodule.exports { publicPath: process.env.VUE_APP_BASE_URL, // 关键修改点 devServer: { // 开发环境配置... } }这里有个坑旧版本可能配置的是baseUrl而Vue CLI 3版本需要使用publicPath。我曾经因为用错属性名导致打包后所有静态资源404。3.2 调整路由配置在src/router/index.js中修改Router实例export default new Router({ base: process.env.VUE_APP_BASE_URL, // 新增配置 mode: history, routes: constantRoutes })如果不加这个配置刷新页面时Vue Router会从根路径开始匹配路由导致页面组件加载失败。3.3 修正请求路径在src/utils/request.js中找到所有硬编码的路径改为动态拼接// 修改前 location.href /index // 修改后 location.href process.env.VUE_APP_BASE_URL /index类似修改还需要在src/layout/components/Navbar.vue等包含路径跳转的文件中进行。我曾经因为漏改Navbar.vue导致退出登录后跳转到了404页面。4. Nginx关键配置详解这是整个部署过程中最容易出错的部分先看最终可用的配置模板location /admin/ { alias /home/project/ruoyi-ui/dist/; try_files $uri $uri/ /admin/index.html; index index.html; # 静态资源缓存配置 location ~* \.(js|css|png|jpg)$ { expires 1y; add_header Cache-Control public, immutable; } }4.1 alias与root的区别root会把location路径拼接到指定目录后alias直接映射指定目录不拼接location路径比如# 错误示例会导致路径变成/home/project/ruoyi-ui/dist/admin/ location /admin/ { root /home/project/ruoyi-ui/dist; } # 正确用法 location /admin/ { alias /home/project/ruoyi-ui/dist/; # 注意结尾的/ }4.2 try_files指令解析这个配置是解决404问题的核心try_files $uri $uri/ /admin/index.html;它的执行逻辑是先尝试查找真实存在的文件$uri再尝试查找目录$uri/都找不到时返回index.html交给前端路由处理4.3 常见配置错误路径结尾缺少斜杠alias /home/project/ruoyi-ui/dist; # 错误 alias /home/project/ruoyi-ui/dist/; # 正确try_files顺序错误try_files /admin/index.html $uri $uri/; # 错误location匹配冲突location / { try_files $uri $uri/ /index.html; } location /admin/ { # 这个配置永远不会生效 }5. 完整部署流程检查清单前端构建npm run build:prod检查dist目录是否生成正确静态资源路径是否包含/admin/前缀Nginx配置验证nginx -t systemctl restart nginx问题排查技巧浏览器F12查看Network面板确认资源加载路径检查Nginx错误日志tail -f /var/log/nginx/error.log使用curl测试API接口响应我在实际部署中遇到过静态资源加载失败的问题最后发现是因为Nginx配置中多了个rewrite规则导致路径被改写。建议每次修改配置后都清空浏览器缓存再测试。6. 多应用部署方案当需要在同一域名下部署多个RuoYi应用时比如/admin/和/portal/可以这样配置# 后台管理系统 location /admin/ { alias /home/admin-ui/dist/; try_files $uri $uri/ /admin/index.html; } # 用户门户系统 location /portal/ { alias /home/portal-ui/dist/; try_files $uri $uri/ /portal/index.html; } # API接口转发 location /admin-api/ { proxy_pass http://backend-server; proxy_set_header Host $host; }这种架构下要特别注意每个应用使用独立的环境变量配置API路径需要区分不同前缀静态资源缓存策略要分开设置7. 进阶优化技巧CDN加速配置 修改vue.config.js中的publicPath为CDN地址publicPath: process.env.NODE_ENV production ? https://cdn.example.com/admin/ : process.env.VUE_APP_BASE_URLGzip压缩 在Nginx中添加配置gzip on; gzip_types text/plain application/xml application/javascript;浏览器缓存策略location ~* \.(js|css|png)$ { expires 1y; add_header Cache-Control public, immutable; }安全头设置add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff;经过这些优化后我们的管理后台在Chrome Lighthouse测试中性能评分从58提升到了92。特别是在弱网环境下页面加载速度提升了3倍以上。
从V-T变换到数字量:双积分型ADC的精密时间测量原理剖析 1. 双积分型ADC的核心原理双积分型ADC(Analog-to-Digital Converter)是一种经典的模数转换技术,它的核心思想是通过电压-时间(V-T)变换,将模拟电压信号转换为数字量。这种转换方式特别适合处理低速变化的高… 2026/7/15 8:14:19
Python与R混合编程:数据科学全链路协同实战指南 1. 为什么这个问题从来就不是“二选一”,而是“如何协同作战”Python 和 R——这两个词在数据科学新人的入门清单上,几乎总是一起出现,又总被拿来比较。你刚点开招聘网站,看到“熟练掌握 Python 或 R”时心里一紧;翻开… 2026/7/15 8:12:18
51单片机——定时器中断驱动蜂鸣器,从简谱到《孤勇者》的嵌入式音乐实现 1. 蜂鸣器与音乐播放基础第一次用51单片机让蜂鸣器唱歌时,那种成就感至今难忘。无源蜂鸣器就像个"音乐傀儡",完全靠我们输入的脉冲频率来决定它的音高。这里有个很形象的比喻:蜂鸣器相当于人的声带,而定时器就是控制声带… 2026/7/15 8:12:18
耳夹式耳机实测:300元到1200元,价格差异到底值不值? 最近在耳机市场,耳夹式耳机突然火了起来。从几十块的入门款到上千元的高端型号,价格跨度之大让人眼花缭乱。作为一个长期被传统入耳式耳机“折磨”的用户——戴久了耳朵疼、运动时容易掉、通勤时隔绝环境音不安全——我对这种新型耳机充满了期待。但问题… 2026/7/15 10:30:02
如何30秒看透B站评论区真实身份:开源成分检测器完全指南 如何30秒看透B站评论区真实身份:开源成分检测器完全指南 【免费下载链接】bilibili-comment-checker B站评论区自动标注成分,支持动态和关注识别以及手动输入 UID 识别 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-comment-checker 你… 2026/7/15 10:27:59
CANN/asc-devkit SIMD-API数据类型转换 asc_uint162uint8 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitco… 2026/7/15 10:27:58
嵌入式Rust新手必读:std-training硬件检查项目完整指南 嵌入式Rust新手必读:std-training硬件检查项目完整指南 【免费下载链接】std-training Embedded Rust on Espressif training material. 项目地址: https://gitcode.com/gh_mirrors/st/std-training 嵌入式Rust开发正在成为物联网(IoT)和嵌入式系统领域的热门… 2026/7/15 10:27:58
C++操作系统自动组卷系统:从算法设计到工程实践 1. 项目概述与核心价值 最近在指导一些计算机专业的同学做毕业设计,发现一个高频需求:如何把一个听起来很“学术”、很“系统”的题目,变成一个真正能跑起来、有完整代码、有清晰文档,并且能写在简历里作为亮点的实战项目。“&… 2026/7/15 10:23:56
Windows窗口管理革命:RBTray让你一键将任何窗口藏进系统托盘 Windows窗口管理革命:RBTray让你一键将任何窗口藏进系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 还在为Windows任务栏上拥挤的窗口图标而烦恼吗&am… 2026/7/15 10:21:55
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41