You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.0.0部署Nginx反向代理后出现404错误求助

问题:Spring Boot 3.0.0升级后Nginx反向代理下出现404错误

我有一个部署在Nginx反向代理后的Spring Boot应用,将版本从2.7.0升级到3.0.0后出现404错误。

Nginx反向代理配置

location /cpoprocesscontrol {
      proxy_pass  http://spring-docker-container-name:8014/;
      proxy_http_version                 1.1;
      # don't cache it
      proxy_no_cache                     1;
      # even if cached, don't try to use it
      proxy_cache_bypass                 1;

      # Proxy headers
      proxy_set_header Upgrade           $http_upgrade;
      proxy_set_header Connection        "upgrade";
      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;
      proxy_set_header X-Forwarded-Host  $host;
      proxy_set_header X-Forwarded-Port  $server_port;
      # Proxy headers

      # Proxy timeouts
      proxy_connect_timeout              3600s;
      proxy_send_timeout                 3600s;
      proxy_read_timeout                 3600s;
} 

添加的Swagger相关依赖

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>

访问地址与错误响应

访问的API地址:

https://company-name/cpoprocesscontrol/workflow/getAllWorkflowContainingNamePageable?page=0&size=20

得到的404响应:

{"timestamp":1674146900016,
"status":404,
"error":"Not Found",
"path":"//workflow/getAllWorkflowContainingNamePageable"}

Nginx版本为1.19.7,请问版本升级中哪些改动会导致该问题?


问题分析与解决方案

核心原因1:Springfox与Spring Boot 3.0不兼容

Springfox 3.0仅支持基于Java EE的Spring Boot 2.x版本,而Spring Boot 3.0全面迁移到Jakarta EE(替代原Java EE规范),Servlet API包路径从javax.servlet变为jakarta.servlet,导致Springfox无法正常加载,干扰Spring MVC的路由映射注册,部分API无法被正确识别。

同时你同时引入了Springfox和SpringDoc两套Swagger工具,这会引发依赖冲突和路由处理冲突,进一步加剧路径匹配异常。

核心原因2:路径解析的双斜杠问题

错误响应中的path为//workflow/getAllWorkflowContainingNamePageable,说明请求路径被解析为双斜杠。原因在于:

  • Nginx配置中proxy_pass末尾带有斜杠/,会将location匹配的/cpoprocesscontrol替换为/,原请求/cpoprocesscontrol/workflow/...会被转发为/workflow/...
  • Spring Boot 3.0对路径匹配的规则更严格,当应用未设置server.servlet.context-path时,转发过来的/workflow/...可能被错误解析为双斜杠路径,导致路由匹配失败。

修复步骤

  1. 移除所有Springfox依赖,仅保留SpringDoc依赖(SpringDoc是Spring Boot 3.x官方推荐的OpenAPI/Swagger工具):

    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
        <version>2.0.2</version>
    </dependency>
    
  2. 调整Nginx代理配置或Spring Boot上下文路径:

    • 方案一:修改Nginx的proxy_pass,去掉末尾的斜杠,让完整路径传递给后端:
      location /cpoprocesscontrol {
            proxy_pass  http://spring-docker-container-name:8014;
            # 其余配置保持不变
      }
      
    • 方案二:在Spring Boot配置文件中设置上下文路径,与Nginx的location匹配:
      server.servlet.context-path=/cpoprocesscontrol
      
      此时Nginx的proxy_pass可以保留末尾斜杠,请求路径会被正确映射。
  3. 验证路由映射:启动应用后,通过SpringDoc的UI(默认地址/swagger-ui.html)检查API是否正常注册,确认所有接口的路径与请求地址匹配。


内容的提问来源于stack exchange,提问作者Aldo Inácio da Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:25:19