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

时间:2011-04-21 07:58:58

标签: java apache ssl http-headers ssl-certificate

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

应用程序设置是这样的,tomcat与Apache webserver进行对话,后者又与Cisco Load Balancer对话,最后平衡器将页面发布到客户端(tomcat - > apache2 - >负载均衡器 - >客户端)。

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

检查我的网页的头文件我找不到 X-FORWARDED-PROTO 标头。我也无法访问Load Balancer配置,并且IT建议我们使用 X-FORWARDED-PROTO 来区分HTTP和HTTPS请求。

是否有任何配置要在Tomcat或Apache级别完成,以便它将返回 X-FORWARDED-PROTO 标头?或者是否应该在Load Balancer中处理配置?

2 个答案:

答案 0 :(得分:25)

我很确定你现在已经弄明白了但是我会补充答案。

您可以在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”。出于安全原因,我建议即使它使用默认值也可以设置它。

查看here了解更多信息。

答案 1 :(得分:0)

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

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

这假定您的健康检查是/状态,不需要https