在Java Web应用程序中处理X-FORWARDED-PROTO标头

14

请问有人能指导我在Java Web应用程序中使用X-FORWARDED-PROTO头部信息的处理方法吗?

应用程序的设置是这样的:Tomcat与Apache Web服务器通信,后者再与Cisco负载均衡器通信,最终由负载均衡器将页面发布给客户端(tomcat -> apache2 -> 负载均衡器 -> 客户端)。

SSL证书已安装在负载均衡器上,它处理HTTPS请求。我的要求是使应用程序使用X-FORWARDED-PROTO并将页面更改为HTTP或HTTPS。

检查我的网页的头文件时,我找不到X-FORWARDED-PROTO头部信息。我也无法访问负载均衡器配置,IT建议我们使用X-FORWARDED-PROTO来区分HTTP和HTTPS请求。

在Tomcat或Apache级别上需要进行配置以返回X-FORWARDED-PROTO头部信息吗?还是配置应该在负载均衡器中处理?

2个回答

28

我非常确定你现在已经全部搞定了,但是我仍然会添加答案。

您可以在tomcat的conf/server.xml文件中的引擎标签中使用类org.apache.catalina.valves.RemoteIpValve

    <Valve className="org.apache.catalina.valves.RemoteIpValve"
           internalProxies="192.168.1.XXX"
           remoteIpHeader="x-forwarded-for"
           remoteIpProxiesHeader="x-forwarded-by"
           protocolHeader="x-forwarded-proto"
    />

需要注意的一点非常重要,那就是设置internalProxies值。如果未设置此项,并且使用的是非标准网络配置,则可能会导致一些问题,其中Tomcat将不会检查x-forwarded头,并默认为“http”。出于安全原因,即使使用默认设置也建议进行设置。

这里查看更多信息。


1
如果您正在使用Apache代理请求到Tomcat,则需要将以下内容添加到Apache的SSL配置中:RequestHeader set X-Forwarded-Proto“https” - James Cooper
4
Tomcat 7的字段略有不同-http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html - Alex Dean
1
你说:“出于安全考虑,即使代理IP在默认允许范围内,我建议设置它。” 你能详细说明一下吗?我一直在想,即使代理IP在默认允许范围内,这个设置是否也应该进行。 - em_bo
这个答案非常完美。@Allan 感谢您强调 internalProxies 的重要性,这正是我所缺少的。 - codependent
请注意,您实际上只需要设置 protocolHeader="X-Forwarded-Proto"(根据您的设置可能还需要 internalProxies)。其余部分都具有默认值,在大多数情况下应该是可以的。具体来说,IP已经被重写了(因此不需要 remoteIpHeaderremoteIpProxiesHeader)。 - Nux
对我来说几乎可以工作了。我连接方式为 https://site:8888,将这个设置添加到我的 server.xml 中解决了它转发到 http://site:8888/login 的问题。现在它在 URL 中正确地转发到 https。然而,它失去了端口。所以 https://site:8888 变成了 https://site/login...你如何保留端口呢? - user1667016

0
将以下内容添加到您的Apache虚拟主机以管理连接:
<VirtualHost *:80>
  ...
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>

这假设您的健康检查是 /status,不需要 https


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接