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

任何人都可以指导我在部署到Apache Tomcat的Java Web应用程序中使用X-FORWARDED-PROTO标头。

应用程序设置的方式是tomcat与Apache Web服务器对话,Apache Web服务器又与Cisco Load Balancer对话,最终平衡器将页面发布到客户端(tomcat ->apache2 ->负载均衡器->客户端)。

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

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

在Tomcat或Apache级别中是否有任何配置要完成,以便它将返回X-FORWARDED-PROTO标头?还是应该在负载均衡器中处理配置?


答案 1

我很确定你现在已经弄清楚了,但我还是会添加答案。

您可以在 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"
    />

需要注意的是,设置内部代理值非常重要。如果未设置此项,并且您使用的是非标准网络设置,则可能会导致一些问题,其中tomcat不会检查x转发的标头,并且它将默认为“http”。出于安全原因,我建议设置它,即使它与默认值一起使用。

有关详细信息,请查看此处


答案 2

将其添加到您的apache vhost管理连接

<VirtualHost *:80>
  ...
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</VirtualHost>

这假设您的运行状况检查是 /status,这不需要 https


推荐