Springdoc-openapi: Doploy behind a reverse proxy

Created on 11 Nov 2019  路  5Comments  路  Source: springdoc/springdoc-openapi

I'm moving from springfox to springdoc and I'm finding the following problem.

In the doc, you specify that the deploy urls are as follows:

http://server:port/context-path/swagger-ui.html
http://server:port/context-path/v3/api-docs 

In my case, the Spring Project is behind a reverse proxy, and I don't have access to the base url of the server, so my urls look something like:

http://server:port/custom-path/context-path/swagger-ui.html
http://server:port/custom-path/context-path/v3/api-docs 

The problem is when I attempt to enter to the swagger-ui.html I see this error:
image
The point is, the web page is attempting to reach http://server:port/context-path/v3/api-docs instead of http://server:port/custom-path/context-path/v3/api-docs

As a last thing to mention, if I try to load http://server:port/custom-path/context-path/swagger-ui/index.html?url=/custom-path/context-path/v3/api-docs&validatorUrl= the page loads as expected

Is there a way to customize the path it loads by default? or maybe make it able to know the path where you are?

Most helpful comment

Hi,

First of all, you need to make sure the following header is set in your reverse proxy configuration: X-Forwarded-Prefix
For example, using apache 2, configuration

RequestHeader set X-Forwarded-Prefix "/custom-path"

Then, in your spring-boot application make sure your application handles this header: X-Forwarded-For. There are two ways to achieve this:

  • Since spring-boot 2.2, there is a new property to handle reverse proxy headers:
server.forward-headers-strategy=framework
  • Or you can add the following Bean to your application:
@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
   return new ForwardedHeaderFilter();
} 

Please don't forget to give a feedback about which option resolved your issue.

All 5 comments

Hi,

In general, behind 脿 reverse proxy, your application that ships the springbok-openapi should have the following line in the application.properties:

server.use-forward-headers=true

This will make sure that, the redirects of the swagger-ui, will not go to the server behind the proxy.
Can you please test it, and give us your feedback?

I've tried your suggested property but sadly it seems that only that is not enough. I'll try to check what else is missing if you think it should work without needing to change how the path is built

Hi,

First of all, you need to make sure the following header is set in your reverse proxy configuration: X-Forwarded-Prefix
For example, using apache 2, configuration

RequestHeader set X-Forwarded-Prefix "/custom-path"

Then, in your spring-boot application make sure your application handles this header: X-Forwarded-For. There are two ways to achieve this:

  • Since spring-boot 2.2, there is a new property to handle reverse proxy headers:
server.forward-headers-strategy=framework
  • Or you can add the following Bean to your application:
@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
   return new ForwardedHeaderFilter();
} 

Please don't forget to give a feedback about which option resolved your issue.

Hi, I've been able to fix this issue by adding the @Bean and adding the headers to my nginx proxy.
Thanks

Great. Thank you for your feedback.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

andygoossens picture andygoossens  路  6Comments

debargharoy picture debargharoy  路  3Comments

kfirfer picture kfirfer  路  5Comments

kingtran2112 picture kingtran2112  路  5Comments

bfs-natewallman picture bfs-natewallman  路  4Comments