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

SpringBoot集成Swagger反向代理下重定向异常问题

问题描述

反向代理后的SpringBoot项目集成Swagger后出现重定向异常:

  • 访问https://localhost:8080/api时,未正确跳转到https://localhost:8080/api/swagger-ui/index.html,反而重定向到https://<本机网络主机名>:8081/api/swagger-ui/index
  • 访问带尾斜杠的https://localhost:8080/api/时,重定向行为符合预期

执行curl -v -k https://localhost:8080/api得到的请求和响应如下:

请求:

GET /api HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.76.1
Accept: */*

响应:

HTTP/1.1 302 Found
transfer-encoding: chunked
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Location: https://<本机网络主机名>:8081/api/
Date: Thu, 23 Nov 2023 09:32:01 GMT

怀疑SpringBoot的重定向逻辑有问题,但无法定位具体位置。

解决方案

这个问题本质是SpringBoot处理无尾斜杠路径的自动重定向时,没有正确识别反向代理传递的真实访问主机、端口和协议,而是使用了应用自身绑定的主机名和端口(8081)。

1. 配置SpringBoot识别反向代理请求头

在application.yml或application.properties中添加配置,让SpringBoot从反向代理的请求头中获取真实访问信息:

server:
  forward-headers-strategy: framework
  tomcat:
    remoteip:
      remote-ip-header: X-Forwarded-For
      protocol-header: X-Forwarded-Proto
      port-header: X-Forwarded-Port

properties格式:

server.forward-headers-strategy=framework
server.tomcat.remoteip.remote-ip-header=X-Forwarded-For
server.tomcat.remoteip.protocol-header=X-Forwarded-Proto
server.tomcat.remoteip.port-header=X-Forwarded-Port

注意:需确保反向代理(如Nginx)转发请求时已添加对应头信息,Nginx配置片段示例:

location /api {
    proxy_pass http://localhost:8081/api;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
}

2. 明确配置Swagger基础路径

如果上述配置后仍有问题,需指定Swagger的上下文路径和UI基础URL:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Value("${server.servlet.context-path:/api}")
    private String contextPath;

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .pathMapping(contextPath)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.your.package"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("API文档")
                .version("1.0")
                .build();
    }
}

同时在application.yml中配置Swagger UI路径:

springdoc:
  swagger-ui:
    path: /swagger-ui.html
    base-url: /api

(若使用SpringFox而非SpringDoc,对应调整配置项)

3. 自定义Tomcat重定向规则

若问题源于Tomcat的自动重定向逻辑,可自定义Tomcat配置强制使用正确的外部访问信息:

@Configuration
public class TomcatConfig {
    @Bean
    public TomcatServletWebServerFactory tomcatFactory() {
        return new TomcatServletWebServerFactory() {
            @Override
            protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
                super.prepareContext(host, initializers);
                host.setRedirectPort(8080); // 设置反向代理的外部端口
                host.setScheme("https"); // 设置外部访问协议
            }
        };
    }
}
关键原因

访问不带尾斜杠的/api时,SpringBoot(Tomcat)会自动重定向到带尾斜杠的/api/,若未正确读取反向代理传递的头信息,就会用应用自身绑定的主机名和端口生成Location头,导致重定向地址错误;而访问带尾斜杠的路径时,Swagger路由逻辑直接处理,不会触发Tomcat的自动重定向,因此行为正常。

内容的提问来源于stack exchange,提问作者mlombasc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:36:26