-
Notifications
You must be signed in to change notification settings - Fork 41.5k
Description
Spring Boot Version 2.1.0 (and earlier down to 1.x)
Hello,
the documentation regarding Front-end Proxy Server states:
If the proxy adds conventional X-Forwarded-For and X-Forwarded-Proto headers (most proxy servers do so), the absolute links should be rendered correctly ...
This is not fully true, at least not for Tomcat:
The only thing that Tomcat RemoteIpValve
(which is activated by server.use-forward-headers
) does with X-Forwarded-For
header is to determine the 'correct' remote ip address of the client.
(And BTW, this is also the only thing that is currently tested regarding use-forward-headers in Spring Boot: here)
So, the only useful thing that Tomcat RemoteIpValve
does regarding absolute links is to set the scheme and the port of the servlet request according to the X-Forwarded headers
.
The Tomcat RemoteIpValve
does nothing regarding the serverName of the request. But it is essential for rendering correct absolute links that the serverName is set to the host name of the proxy server.
There is an open ticket for Tomcat to do this in RemoteIpValve
by using X-Forwarded-Host
header. But as long as this is not resolved, the only way to get correct redirect URIs is to make sure that the proxy server leaves the Host header unchanged.
At least this should be clarified in the documentation.
However, there are scenarios, where the Proxy Server changes the host header. Even Spring Cloud Zuul does this (or at least did this) by default (and sets X-Forwarded-Host
to preserve proxy host somewhere).
So, it is probably not a good suggestion just to say "use server.use-forward-headers
, and everything will be alright behind a proxy."
Spring's ForwardedHeaderFilter (which supports X-Forwarded-Host and X-Forwarded-Prefix) should at least be mentioned as an alternative, even if Spring Boot does not want to make it the default (see here). Especially now with Spring 5.1, where ForwardedHeaderFilter
has become the "standard way" to cope with Forwarded-Headers in Spring (see also here).
Additionally there are existing discussions regarding ForwardedHeaderFilter
or not, so the difficulties with the use-forward-headers approach are not new. However, someone who just starts by reading the documentation will not know anything about those details and will raise issues or SO questions regarding "it does not work behind proxy".
Best Regards,
Stefan.