本地正常、上线就挂多因路径或协议不一致:context-path 配置差异致404;HTTP/HTTPS头未透传引发重定向循环;CDN/代理截断静态资源路径;需统一检查配置、代理头及资源路径。

本地正常、上线就挂,八成不是玄学,而是路径或协议层面的隐性不一致在作祟。这类问题往往不报错,或者只在特定请求路径下触发 404、500、重定向循环、跨域拦截等表象,根源却藏在 request.getRequestURL()、request.getScheme()、server.servlet.context-path 或反向代理配置里。
Spring Boot 中 context-path 不一致导致接口 404
本地开发常省略 server.servlet.context-path,默认为 /;但线上为统一管理,可能配置了 /api/v1。此时 Controller 的 @RequestMapping("/user") 实际映射路径变成 /api/v1/user,而前端仍请求 /user,必然 404。
- 检查
application.yml中是否漏配或误配server.servlet.context-path,尤其注意 profile 切换(application-prod.yml是否覆盖) - 不要在前端硬编码 base URL,改用后端透出的
X-Base-Path响应头,或通过/actuator/env接口运行时确认 - 若使用 Nginx 反向代理,需同步调整
location /api/v1/的proxy_pass,末尾斜杠必须严格匹配:写成proxy_pass http://backend/;(带尾部/)才能剥离前缀
HTTP/HTTPS 协议不一致引发重定向死循环
Tomcat 默认走 HTTP,但线上通常由 Nginx/Traefik 终止 HTTPS,再以 HTTP 转发给后端。若未正确设置 server.forward-headers-strategy=framework,request.isSecure() 会返回 false,Spring Security 的 requiresChannel().requiresSecure() 就会强制跳转 HTTPS —— 而 Nginx 已经是 HTTPS,结果反复 302。
- 必须启用正向头解析:
server.forward-headers-strategy=framework(Spring Boot 2.2+)或显式配置server.tomcat.remote-ip-header=x-forwarded-for+server.tomcat.protocol-header=x-forwarded-proto - Nginx 配置中务必包含:
proxy_set_header X-Forwarded-Proto $scheme;和proxy_set_header X-Forwarded-For $remote_addr; - 验证方式:打印
request.getScheme()和request.getHeader("x-forwarded-proto"),二者应一致且为https
静态资源路径因 CDN 或代理被截断
本地直接访问 http://localhost:8080/static/js/app.js 没问题;线上走 CDN 或多层代理后,/static/ 路径可能被重写、缓存或拒绝。常见现象是 HTML 加载成功,但 JS/CSS 返回 404 或空响应。
- 确认资源是否真在 classpath 下(
src/main/resources/static/)或外部目录(需配置spring.web.resources.static-locations) - 检查 CDN 缓存规则:是否把
/static/**误设为“不缓存”或“拒绝访问”,或设置了错误的 Origin 回源路径 - 用浏览器 DevTools 的 Network 面板看具体请求 URL 和 Response Headers,重点比对
X-Cache、X-Proxy、Content-Length是否异常
真正棘手的从来不是配置项本身,而是多个中间件(Nginx → Spring → CDN → 浏览器)对同一路径或头字段的理解偏差。上线前拿 curl 模拟真实链路:从外网 IP 发起 HTTPS 请求,逐层加 -v 看重定向和头传递,比只查日志快得多。

















