2017-04-06 33 views
0

我们有以下的HTTPS流量的情况下设置:Tomcat的背后防火墙后面的Apache:AJP忽略X - 转发,原

  • 防火墙:终止HTTPS,增加了 “X-转发 - 协议:https” 开头,转发到阿帕奇通过http
  • 阿帕奇:转发到Tomcat通过AJP
  • 的Tomcat:

    :通过AJP连接器

我们增加了RemoteIpValve到Tomcat的server.xml接收请求

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

如果我们跳过Apache并使用普通的HTTP连接器直接从防火墙转发到Tomcat,它就可以工作。在这种情况下,Tomcat使用https来重定向和基地网址。

但是,一旦我们通过Apache和AJP,X-Forwarded-Proto头似乎被忽略。我们检查了X-Forwarded-Proto头在Tomcat的请求中仍然存在。

我想通过AJP告诉Tomcat使用了哪个前端协议(http或https)。也许这不会发生?我们是否需要告诉Apache以某种方式考虑AJP的X-Forwarded-Proto?

Apache的虚拟主机配置:

<VirtualHost *:80> 
    ServerName www.myserver.biz 

    JkMount /* LoadBalancerHD 
</VirtualHost> 

workers.properties:

worker.list=LoadBalancerHD 

worker.LoadBalancerHD.balance_workers=HDNode1,HDNode2 
worker.LoadBalancerHD.type=lb 
worker.LoadBalancerHD.sticky_session=True 

worker.HDNode1.type=ajp13 
worker.HDNode1.host=webserver01 
worker.HDNode1.port=8010 
worker.HDNode1.distance=0 

worker.HDNode2.type=ajp13 
worker.HDNode2.port=8010 
worker.HDNode2.host=webserver02 
worker.HDNode2.distance=1 

回答

0

研究mod_jk的文档后,我发现,mod_jk的评估Apache的环境变量HTTPS以检测HTTPS。通常,如果Apache处理https流量本身,则此变量由mod_ssl设置。但事实并非如此,因为HTTPS在Apache之前已经终止。

简单地设置基于HTTP头中的环境变量的伎俩:

SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on 

顺便说一句:将其通过mod_jk的评估的环境变量可与JkHTTPSIndicator指令(见mod_jk docs)来改变。所以下面不相同:

SetEnvIfNoCase X-Forwarded-Proto https EXTERNAL_TRAFFIC_IS_HTTPS=on 
JkHTTPSIndicator EXTERNAL_TRAFFIC_IS_HTTPS 

可能是有用的,如果改变HTTPS将与其他模块的干扰。