若依(RuoYi)项目采用 Spring Boot + Vue 前后端分离架构后,通常会通过 Nginx 作为统一入口,实现前端静态资源代理、后端接口转发以及域名访问控制。但在实际部署过程中,经常会遇到两个典型问题:页面能够正常打开,但接口请求返回 404;登录页面可以加载,却无法显示验证码。
这类问题大多数并不是若依项目代码本身异常,而是 Nginx 代理配置、接口路径匹配、跨域处理或静态资源映射不正确导致。下面结合常见部署场景,对 Nginx 部署若依项目时接口 404 和验证码不显示问题进行系统分析。
一、若依项目部署架构分析
若依前后端分离版本通常包含两个部分:
-
Vue 前端项目:编译后生成 dist 目录,由 Nginx 提供静态访问。
-
Spring Boot 后端服务:运行在独立端口,例如 8080,通过接口提供数据服务。
典型访问流程如下:
用户浏览器 | ↓ Nginx(80/443端口) | ├── / → Vue静态页面 | └── /prod-api/ → Spring Boot后端接口
若依默认情况下,前端请求接口通常类似:
/prod-api/login /prod-api/captchaImage /prod-api/getInfo
Nginx 需要将 /prod-api/ 开头的请求正确转发到后端服务。
如果代理规则缺失,请求会直接进入 Vue 路由处理,最终返回 404。
二、接口404问题常见原因
1. Nginx未配置接口代理
这是最常见的问题。
例如:
浏览器访问:
http://example.com/prod-api/login
如果 Nginx 没有代理配置,请求会寻找:
/usr/share/nginx/html/prod-api/login
而这个目录通常不存在,因此返回:
404 Not Found
解决方式是在 Nginx 配置文件中增加代理规则。
示例:
Nginxserver { listen 80; server_name example.com; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
重点注意:
Nginxlocation /prod-api/
必须与若依前端配置保持一致。
三、proxy_pass路径配置错误导致接口404
Nginx中的 proxy_pass 尾部斜杠非常关键。
例如:
错误配置
Nginxlocation /prod-api/ { proxy_pass http://127.0.0.1:8080; }
请求:
/prod-api/login
可能转发为:
http://127.0.0.1:8080/prod-api/login
如果后端接口实际地址:
http://127.0.0.1:8080/login
就会返回404。
正确方式:
Nginxlocation /prod-api/ { proxy_pass http://127.0.0.1:8080/; }
这样:
/prod-api/login
会转换为:
/login
符合若依后端接口路径。
四、检查若依前端接口前缀配置
如果 Nginx 使用:
/prod-api/
作为接口代理路径,需要确认 Vue 项目的环境配置。
打开:
.env.production
通常可以看到:
propertiesVUE_APP_BASE_API = '/prod-api'
如果修改过,例如:
propertiesVUE_APP_BASE_API = ''
那么前端请求会变成:
/login
而不是:
/prod-api/login
最终导致接口无法匹配。
修改后需要重新编译:
Bashnpm run build
然后重新替换 Nginx 部署目录中的 dist 文件。
五、验证码不显示的原因分析
若依登录验证码接口通常为:
GET /captchaImage
前端实际请求:
/prod-api/captchaImage
验证码无法显示,一般有以下几种情况。
六、验证码接口代理失败
打开浏览器开发者工具:
进入:
F12 → Network → captchaImage
查看请求状态。
如果显示:
404
说明 Nginx没有正确代理验证码接口。
解决方式:
确认存在:
Nginxlocation /prod-api/ { proxy_pass http://127.0.0.1:8080/; }
然后重新加载:
Bashnginx -s reload
七、验证码跨域问题
如果前端和后端不是同一个域名,例如:
前端:
https://www.demo.com
后端:
http://127.0.0.1:8080
浏览器会受到跨域限制。
推荐通过 Nginx 统一代理:
https://www.demo.com | | ↓ Nginx | ↓ Spring Boot
不要让浏览器直接访问后端地址。
八、验证码缓存导致显示异常
若依验证码接口返回的是图片数据或 Base64 数据。
部分浏览器或代理服务器可能缓存验证码请求。
可以增加缓存控制:
Nginxlocation /prod-api/ { proxy_pass http://127.0.0.1:8080/; add_header Cache-Control no-cache; add_header Pragma no-cache; }
同时检查浏览器是否存在旧缓存。
可以尝试:
-
Ctrl + F5 强制刷新
-
清理浏览器缓存
-
使用无痕窗口测试
九、HTTPS部署时验证码异常
很多生产环境会使用 HTTPS。
如果:
https://example.com
访问前端,
但验证码接口请求:
http://example.com/prod-api/captchaImage
浏览器会阻止混合内容请求。
表现为:
-
登录页面正常
-
验证码区域空白
-
控制台提示 Mixed Content
解决方式:
统一使用 HTTPS。
Nginx配置:
Nginxlocation /prod-api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header X-Forwarded-Proto https; }
同时后端开启代理支持。
Spring Boot配置:
YAMLserver: forward-headers-strategy: framework
十、检查后端服务是否正常运行
Nginx配置正确,也需要确认 Spring Boot 服务状态。
查看端口:
Bashnetstat -tunlp | grep 8080
测试接口:
Bashcurl http://127.0.0.1:8080/captchaImage
如果返回正常数据:
说明后端没有问题。
如果失败:
检查:
-
若依服务是否启动
-
数据库连接是否正常
-
Redis是否运行
-
验证码相关配置是否异常
十一、Nginx完整部署示例
生产环境常用配置:
Nginxserver { listen 80; server_name example.com; location / { root /opt/ruoyi/dist; index index.html; try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 60; } }
该配置实现:
-
Vue页面访问
-
Vue Router刷新支持
-
后端接口代理
-
验证码访问
-
用户登录认证
十二、快速排查流程
遇到若依接口404或验证码不显示,可以按照以下顺序检查:
第一步:检查前端请求地址
浏览器打开:
F12 → Network
确认接口是否:
/prod-api/xxx
第二步:检查Nginx代理
执行:
Bashnginx -t
确认配置无错误。
然后:
Bashnginx -s reload
第三步:测试后端接口
服务器执行:
Bashcurl http://127.0.0.1:8080/captchaImage
确认后端可访问。
第四步:检查proxy_pass斜杠
重点确认:
正确:
Nginxproxy_pass http://127.0.0.1:8080/;
错误:
Nginxproxy_pass http://127.0.0.1:8080;
第五步:检查HTTPS和跨域
如果生产环境使用域名和SSL:
-
前后端协议保持一致
-
不要暴露后端端口
-
使用Nginx统一代理
十三、总结
Nginx部署若依项目后出现接口404和验证码不显示,核心原因通常集中在三个方面:
-
Nginx没有正确代理
/prod-api/请求; -
proxy_pass路径处理错误导致接口地址变化; -
前端接口前缀、HTTPS、跨域配置不一致。
正确部署时,应保证:
-
Vue静态资源由Nginx托管;
-
后端接口通过Nginx反向代理;
-
/prod-api/路径保持统一; -
验证码接口能够正常转发;
-
HTTPS环境避免混合内容。
按照请求路径、Nginx代理、后端服务三个层面逐步排查,基本可以快速解决若依项目上线后的接口异常问题。