反向代理背后的 Springfox Swagger UI

lan*_*oxx 6 swagger-ui springfox

我已经使用 Swagger API 文档配置了一个 Spring Boot 应用程序并配置了 Swagger UI。

我还在一个反向代理后面运行我的后端应用程序,该代理将所有请求映射host:port/apibackend_host:port/,当我在本地本地运行时映射到localhost:8082/api。在生产中应用了类似的映射。

当我从中打开 Swagger UI 时,localhost:8082/api/swagger-ui.html它会在标题下方显示以下几行:

[ 基本 URL: localhost:8080 ]
http://localhost:8082/api/v2/api-docs

当我调用任何休息操作时,swagger 总是尝试针对 localhost:8080 执行它,然后由于相同的来源策略而失败。

我知道使用pathProvider但它只影响基本 URL 的路径部分,而不影响域和端口。所以我只能使用它来将基本 URL 更改为 localhost:8080/api 但我需要将其更改为 localhost:8082/api。有没有办法将主机动态设置为浏览器中活动的当前主机和端口?

.pathProvider (new RelativePathProvider (servletContext) {
                @Override
                public String getApplicationBasePath() {
                    return "/api";
                }
               })
Run Code Online (Sandbox Code Playgroud)

SHo*_*oko 8

在我的例子中,使用 spring-boot:2.2.6 应用程序和 springdoc-openapi-ui:1.3.0 (也嵌入了 swagger UI),我通过以下方式解决了设置服务器 URL 的代理问题:

@Configuration
public class OpenApiConfig {

  @Value("${server}")
  private String url;

  @Bean
  @Profile("prod")
  public OpenAPI customConfiguration() {
    return new OpenAPI()
        .servers(Collections
            .singletonList(new Server().url(url))) //real public URL
        .components(new Components())
        .info(new Info().title("Dummy API Docs")
            .description("Dummy REST API documentation"));
  }
}
Run Code Online (Sandbox Code Playgroud)

此更改反映在合同中(https://real-domain.com/api-docs):

OpenAPI合约

在 Swagger UI ( https://real-domain.com/swagger-ui/index.html?configUrl=/api-docs/swagger-config )

Swagger UI 服务器列表


lja*_*der 2

我认为在您的情况下,您需要配置代理以设置 HTTP 标头
(它将转发到您的目标后端)
“通知”Swagger 端点在 /apidocs 端点中返回自定义 URL。

\n\n

请配置代理以将标头X-Forwarded-Host设置为Host请求标头中的值

\n\n

说明:
\n在您的浏览器中,当您访问某个网址时,例如。https://my.domain.com/api/swagger-ui.html

\n\n

代理应该创建并转发标头 X-Forwarded-Host: my.endpoint.com

\n\n

到你的后端localhost:8082/api/swagger-ui.html

\n\n

-> 因此 Swagger /apidocs enpoint 可以在响应 JSON 中考虑此标头。

\n\n

我自己的案例 - 在 Microsoft IIS 中:

\n\n

我需要配置 Microsoft IIS 以通过 HTTPS 域上的 8080 端口上的 Apache Tomcat 为 Swagger IU 提供服务,
\n因此我需要进行以下配置:

\n\n
<serverVariables>\n    <set name="HTTP_X_FORWARDED_HOST" value=\xe2\x80\x9c{HTTP_HOST}\xe2\x80\x9d />\n    <set name="HTTP_X_FORWARDED_PROTO" value="https" />\n</serverVariables>\n
Run Code Online (Sandbox Code Playgroud)\n