首页 文章

在防火墙后面的Apache背后的Tomcat:AJP忽略了X-Forwarded-Proto

提问于
浏览
0

在https流量的情况下,我们有以下设置:

  • 防火墙:终止https,添加"X-Forwarded-Proto: https",通过http转发到Apache

  • Apache:通过AJP转发到Tomcat

  • Tomcat:通过AJP-connector接收请求

我们已将RemoteIpValve添加到Tomcat的server.xml:

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

如果我们跳过Apache并使用常规HTTP连接器从防火墙直接转发到Tomcat,它就可以工作 . 在这种情况下,Tomcat使用https进行重定向和基本URL .

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

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

Apache VirtualHost配置:

<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

1 回答

  • 0

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

    只需根据http标头设置环境变量就可以了:

    SetEnvIfNoCase X-Forwarded-Proto https HTTPS=on
    

    BTW:由mod_jk评估的环境变量可以使用 JkHTTPSIndicator 指令进行更改(请参阅mod_jk docs) . 以下是相同的:

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

    如果更改 HTTPS 会干扰其他模块,可能会有用 .

相关问题