2017-04-06 54 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將與其他模塊的干擾。