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

Springfox Swagger UI反向代理配置问题:Base URL显示异常

解决反向代理下Swagger UI Base URL显示异常的问题

我之前在反向代理部署Spring Boot + Swagger的时候也碰到过一模一样的Base URL显示问题——明明外部访问路径是localhost:8082/api,Swagger UI却硬显示localhost:8080,折腾了好一阵才找到靠谱的解决办法。根据你使用的Swagger组件版本,给你两种针对性的方案:

方案一:如果你用的是SpringDoc OpenAPI(Swagger 3.x,推荐)

这是目前Spring生态下最常用的Swagger集成方式,配置起来很灵活:

方式1:通过配置文件直接指定外部Base URL

在application.properties(或application.yml)中添加以下配置:

# 后端实际上下文路径,因为代理把/api映射到后端的/
server.servlet.context-path=/

# 指定Swagger UI显示的外部Base URL,本地环境就是你的代理地址
springdoc.swagger-ui.server-url=http://localhost:8082/api

# 保持API文档接口的路径和之前一致
springdoc.api-docs.path=/v2/api-docs

如果是生产环境,建议把springdoc.swagger-ui.server-url改成环境变量占位符(比如${SWAGGER_EXTERNAL_BASE_URL}),避免硬编码。

方式2:用相对路径自动适配环境(更灵活)

如果不想硬编码地址,可以通过Java配置让Swagger UI自动使用当前页面的访问路径:

import org.springdoc.core.customizers.OpenApiCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.models.servers.Server;

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenApiCustomizer serverUrlCustomizer() {
        return openApi -> {
            openApi.getServers().clear();
            // 添加相对路径/api,Swagger UI会自动拼接当前页面的host和port
            openApi.getServers().add(new Server().url("/api"));
        };
    }
}

这种方式不管是本地测试还是生产部署,都能自动适配代理后的路径,不用修改配置。

方案二:如果你用的是Springfox Swagger 2.x(旧版本)

如果还在使用传统的Springfox集成,配置方式如下:

方式1:配置文件快速解决

在application.properties中添加:

server.servlet.context-path=/
springfox.documentation.swagger.v2.path=/v2/api-docs
# 指定Swagger UI的基础路径,对应代理的/api
springfox.documentation.swagger-ui.base-url=/api

方式2:Java配置自定义Base URL

如果需要更精细的控制,可以编写Swagger配置类:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;

@Configuration
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.your.project.package"))
                .paths(PathSelectors.any())
                .build()
                // 指定外部访问的Base URL,本地环境就是localhost:8082/api
                .host("localhost:8082/api");
    }

    @Bean
    public UiConfiguration uiConfig() {
        return UiConfigurationBuilder.builder()
                // 设置Swagger UI的基础路径,确保请求都带上/api前缀
                .baseUrl("/api")
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("你的API文档")
                .description("API接口说明")
                .version("1.0")
                .build();
    }
}

额外注意:反向代理的头信息传递

不管用哪种方案,都要确保你的反向代理(比如Nginx)正确传递转发头,这样Spring Boot才能正确识别外部请求的路径。以Nginx为例,配置示例:

location /api {
    proxy_pass http://backend_host:port/;
    # 传递必要的转发头
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Prefix /api;
}

同时在Spring Boot配置中开启转发头处理:

server.forward-headers-strategy=framework

这样配置后,再访问localhost:8082/api/swagger-ui.html,Swagger UI标题下方的Base URL就会正确显示为http://localhost:8082/api了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:36:07