错误的"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-For
、X-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")));
}
}
如果您有 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))
// ...
}
}
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-For
、X-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")));
}
}
如果您有 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))
// ...
}
}