需统一服务注册路径、管理端点与客户端请求路径:确认 server.servlet.context-path 生效,显式配置 metadata 或 management.base-path,动态拼接健康检查 url,避免硬编码和静态资源转发冲突。

后端配置了 server.servlet.context-path,但前端轮询的健康检查路径(比如 /actuator/health)没跟着变,就会报 404 或连接失败——本质是“注册路径”和“实际暴露路径”不一致。重点不是改轮询地址,而是让服务注册中心、管理端点、客户端请求三者对齐。
确认当前 context-path 是否生效
先验证配置是否真正起效,避免白调:
- 启动日志里搜
Tomcat started on port.*with context path,看输出的 context path 是否是你设的值(如/myapp) - 直接浏览器访问
http://localhost:8080/your-context-path/actuator/health,能返回 JSON 就说明端点已就绪 - 如果返回 404,检查是否误用了旧属性名
server.context-path(Spring Boot 2.0+ 必须用server.servlet.context-path)
修复 Spring Boot Admin 的离线问题
Admin 后台显示服务离线,大概率是因为它从注册中心读到的 health 地址仍是根路径,而实际端点已移到 context-path 下。
- 若用 Nacos:在服务 metadata 中显式声明 management 路径,例如:
spring.cloud.nacos.discovery.metadata.management.context-path=${server.servlet.context-path}/actuator - 若用 Eureka:在
application.yml中加:
management.endpoints.web.base-path: /actuator
management.server.base-path: ${server.servlet.context-path}/actuator - 确保
management.endpoints.web.exposure.include=*已开启,否则 health 端点默认不暴露
统一轮询路径的生成逻辑
前端或网关发起轮询时,不能硬写 /actuator/health,应动态拼接 context-path:
- 服务自身可通过
@Value("${server.servlet.context-path}")获取并注入到健康检查 URL 构造逻辑中 - 网关(如 Spring Cloud Gateway)可配置全局前缀重写:
- predicates:
- Path=/myapp/actuator/**
- filters:
- RewritePath=/myapp/(?.*), /$\{segment\} - 若使用 Kubernetes + Prometheus,需同步更新 ServiceMonitor 中的
path字段为/your-context-path/actuator/health
额外注意静态资源与转发冲突
context-path 配置不当可能引发无限转发循环(如请求被反复 forward 到 index 页面),尤其在搭配自定义 WebMvcConfigurer 或错误页面配置时:
- 禁用默认静态资源处理干扰:
spring.web.resources.add-mappings=false - 检查是否有
forward:/类型的 Controller 方法,它可能把带 context-path 的请求又转回根路径 - 确保所有
@RequestMapping的路径都不带开头斜杠以外的 context-path 前缀(即不要写@RequestMapping("/myapp/api"),应写@RequestMapping("/api"))











