当前位置: 首页 > news >正文

warm-flow 生产环境静态资源 404,本地正常的原因与 Nginx 配置解决方案

一、问题背景

项目中引入了一个前端模块warm-flow-ui,其静态资源路径形式如下:

/api/warm-flow-ui/css/index-BxOgKnlB.css

现象描述:

  • 本地开发环境(IDEA 直接运行 Spring Boot)访问正常,页面及 CSS、JS 均能加载。
  • 生产环境(Nginx + Spring Boot)访问同一路径时返回 404:
curl-I http://xxx/api/warm-flow-ui/css/index-BxOgKnlB.css HTTP/1.1404Not Found Server: nginx

二、问题分析过程

1️⃣ 本地为什么可以访问?

本地运行时,Spring Boot 直接提供静态资源,无需 Nginx 转发。
Spring Boot 默认会从以下位置加载静态资源:

  • classpath:/static/
  • classpath:/public/
  • META-INF/resources/

warm-flow-ui的静态文件已经被打包进了 Jar 包中,因此:

访问路径/api/warm-flow-ui/css/index-xxx.css
→ 实际由 Spring Boot 内置的静态资源映射返回。

2️⃣ 生产环境为什么会 404?

生产环境多了一层Nginx 反向代理

location /api/ { proxy_pass http://127.0.0.1:8188/; }

注意这一行配置:
proxy_pass的结尾带了 “/”

这意味着 Nginx 会去掉/api/前缀再转发。
也就是:

请求:/api/warm-flow-ui/css/index-xxx.css
被转发为:/warm-flow-ui/css/index-xxx.css

3️⃣ 验证后端真实路径

直接访问后端服务端口验证:

http://127.0.0.1:8188/warm-flow-ui/css/index-BxOgKnlB.css

✅ 能正常访问,说明后端真实暴露路径为/warm-flow-ui/**
而不是/api/warm-flow-ui/**

三、问题根因

  • 静态文件是存在的,并打包进了 Jar。
  • 问题出在Nginx 转发路径与后端实际静态路径不一致

对应关系如下:

说明
对外访问路径/api/warm-flow-ui/**
后端真实路径/warm-flow-ui/**

因此,需要在 Nginx 层做路径 rewrite 转换。

四、推荐的 Nginx 解决方案

使用rewrite对路径进行明确重写(最清晰也最安全):

location ^~ /api/warm-flow-ui/ { rewrite ^/api/(warm-flow-ui/.*)$ /$1 break; proxy_pass http://127.0.0.1:8188; 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_set_header X-Forwarded-Proto $scheme; }

配置解释:

  • rewrite:将/api/warm-flow-ui/**重写为/warm-flow-ui/**
  • proxy_pass:转发到 Spring Boot 服务。
  • ^~:优先匹配,避光被上层/api/规则恶执。

五、经验总结(避坑要点)

  • 静态资源如果已打入 Jar,Nginx 仅需代理,不需设置rootalias
  • 只有静态文件放在窘盘上时,才使用alias/root
  • ⚠️proxy_pass结尾是否带/会直接影响路径转发!
    很多线上 404 都是因为这个。

六、最终效果

访问路径保持不变:

http://xxx:5666/api/warm-flow-ui/css/index-xxx.css

Nginx 转发后端命中路径:

http://xxx:8188/warm-flow-ui/css/index-xxx.css

前端页面与静态资源均可正常加载 🎉

七、结语

这是一个“本地正常,生产 404”的经典问题。
本质原因是:运行方式 + Nginx 转发规则 + 静态资源路径不一致

希望这次排际过程,能帮到遭遇相似问题的同学 🚀

http://www.cnnetsun.cn/news/106945.html

相关文章:

  • Pyfa舰船配置工具:5个高效技巧助你成为EVE Online配置高手
  • 洛谷 P1892 [BalticOI 2003] 团伙
  • 洛谷 P2024 [NOI2001] 食物链
  • Animeko跨平台动漫追番神器:从入门到精通的完整指南
  • 中级软件设计师英语部分备考攻略:完形填空高频考点与解题技巧
  • 2025年下半年软件设计师易混淆知识点
  • Headscale配置终极指南:从零到精通的环境变量管理技巧
  • 测试架构师的成长路径:从技术执行到质量战略的跨越
  • 多人姿态估计终极指南:从零开始构建实时人体分析系统
  • 【ACWing】150. 括号画家
  • 如何快速掌握Vim插件管理:VAM的完整使用指南
  • 文献分区及影响因子批量查询
  • APKMirror安卓应用下载平台深度解析:从源码到实践
  • 终极FreeMarker模板调试工具:3分钟解决模板语法问题
  • QQScreenShot独立版技术解析:基于模块化架构的屏幕捕捉解决方案
  • 快速掌握SCPI Parser终极指南:构建专业仪器控制系统的完整解决方案
  • 自定义算子的“诞生记”:基于CANN Kernel自调工程的完整CI/CD流水线
  • 高效、稳定、可定制——EmotiVoice开源TTS优势全解析
  • 大模型应用开发(十八)_向量检索
  • NVIDIA显卡设置终极指南:从问题诊断到性能优化的完整解决方案
  • 聚星成链,蓝卓牵头成立“工厂操作系统生态联盟”共建产业新生态
  • 每天一道面试题之架构篇|可靠订单状态机与事务消息架构设计
  • 10分钟掌握开源美颜SDK核心技术:从算法原理到商业应用实战
  • EmotiVoice支持哪些语言?多语种语音合成能力测试报告
  • AI语音合成进入情感时代:EmotiVoice带来全新听觉体验
  • EmotiVoice支持WebAssembly吗?浏览器端运行可能性分析
  • StaMPS雷达数据处理:从零搭建专业位移监测系统
  • yt-dlp-gui终极指南:轻松掌握Windows视频下载利器
  • EmotiVoice是否支持语音情感随机扰动?增强自然感功能
  • QRemeshify终极指南:快速创建高质量四边形网格的完整教程