错误的"Generated server url" in springdoc-openapi-ui (Swagger UI)部署在proxy后面

Wrong "Generated server url" in springdoc-openapi-ui (Swagger UI) deployed behind proxy

Spring 带有 springdoc-openapi-ui (Swagger UI) 的 Boot 2.2 应用程序运行 HTTP 端口。 应用程序部署到 Kubernetes,Ingress 将 HTTPS 请求从集群外部路由到服务。

在这种情况下,在 https://example.com/api/swagger-ui.html 可用的 Swagger UI 有错误的 "Generated server url" - http://example.com/api。虽然它应该是 https://example.com/api.

虽然 Swagger UI 通过 HTTPS 访问,但生成的服务器 URL 仍然使用 HTTP。

springdoc-openapi FAQ 有一个部分 How can I deploy the Doploy springdoc-openapi-ui, behind a reverse proxy?

FAQ 部分可以扩展。

确保 X-Forwarded headers 是由您的代理发送的(X-Forwarded-ForX-Forwarded-Proto 和其他)。

如果您使用的是 Undertow (spring-boot-starter-undertow),请设置 属性 server.forward-headers-strategy=NATIVE 以使 Web 服务器本地处理 X-Forwarded headers。另外,如果您不使用它,请考虑切换到 Undertow。

如果您使用 Tomcat (spring-boot-starter-tomcat),请设置 属性 server.forward-headers-strategy=NATIVE 并确保列出所有内部代理的 IP 地址以信任 属性 server.tomcat.internal-proxies=192\.168\.\d{1,3}\.\d{1,3}。默认情况下,10/8、192.168/16、169.254/16 和 127/8 中的 IP 地址是受信任的。

或者,对于 Tomcat 设置 属性 server.forward-headers-strategy=FRAMEWORK.

有用的链接:

如果接受的解决方案对您不起作用,那么您始终可以通过定义一个 bean 手动设置 url。

@Bean
public OpenAPI customOpenAPI() {
    Server server = new Server();
    server.setUrl("https://example.com/api");
    return new OpenAPI().servers(List.of(server));
}

并且 url 可以通过 属性 定义并在此处注入。

我遇到了同样的问题。以下对我有用。

@OpenAPIDefinition( 
    servers = {
       @Server(url = "/", description = "Default Server URL")
    }
) 
@SpringBootApplication
public class App {
// ...
}

下面对我有用。

@OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@SpringBootApplication
class App{
// ...
}

@OpenAPIDefinition(servers = {@server(url = "/", description = "Default Server URL")})
@Configuration
public class OpenAPIConfig {
@Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("App name")
                        .termsOfService("http://swagger.io/terms/")
                        .license(new License().name("Apache 2.0").url("http://springdoc.org")));
    }
}

Generated server url is HHTP - issue

如果您有 non-default 上下文路径

@Configuration
public class SwaggerConfig {
    
    @Bean
    public OpenAPI openAPI(ServletContext servletContext) {
        Server server = new Server().url(servletContext.getContextPath());
        return new OpenAPI()
                .servers(List.of(server))
                // ...
    }
}