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
相关产品推荐
相关产品推荐

