2012-03-21 102 views
5

我有一個httpd服務器配置爲處理HTTPS連接並將連接轉發到處理請求的Tomcat(通過http或ajp)。我在Tomcat服務器中的一個要求是記錄每個請求的遠程端口號。如果我直接點擊Tomcat,則直接檢索遠程端口號,我們正在使用getRemotePort()函數(HttpServletRequest)來執行此操作。在HTTPD上檢索客戶端源端口 - > Tomcat設置

但是,由於我正在執行反向代理(通過HTTP/AJP轉發HTTPS請求),因此將創建一個新連接,並且始終會爲連接獲取遠程端口(以及遠程IP)我的httpd服務器到tomcat(除了當我使用AJP。在這種情況下,遠程服務器IP信息正確)。

我已經嘗試了httpd的不同配置,如:

ProxyPreserveHost On 
ProxyPass/ajp://localhost:8009/ 

ProxyPreserveHost On 
ProxyPass/http://localhost:8081/ 

我也玩過一點點用的RewriteRules,但不能讓事情工作。

閱讀httpd文檔,mod_proxy爲X-Forwarded-HostX-Forwarded-For等提供了請求頭信息。但是沒有關於源端口的信息。

我已經even found a bug,顯然X-Forwarded-Port屬性被添加到代理請求頭,但該代碼似乎沒有對主線/分支。

因此,總而言之,當HTTPD將請求轉發給Tomcat時,如何檢索客戶端的源端口(而不是反向代理)?

+0

所以你得到遠程IP地址,但不是端口?另外,你可以傳遞tomcat/httpd的版本號。你發現的httpd錯誤是1.3版本的 – bubbly 2012-03-22 02:19:33

+0

嗨凱文。我正在使用Apache httpd v 2.2.3和Tomcat 5.5 – alp 2012-03-22 18:35:25

+0

X-Forwarded-For work? – bubbly 2012-03-22 19:49:41

回答

0

我相信你能做到這一點使用mod_rewrite的模塊

RewriteRule您可以指定在換人字符串服務器變量如文檔中表示

In addition to plain text, the Substition string can include 

    back-references ($N) to the RewriteRule pattern 
    back-references (%N) to the last matched RewriteCond pattern 
    server-variables as in rule condition test-strings (%{VARNAME}) 

這些變量之一是REMOTE_PORT 。 然後,您可以重寫URL並將其作爲URL參數傳遞給Tomcat servlet調用,例如

http://url.to.tomcat/mycontext?remoteport=${REMOTE_PORT}

3

您可以添加一個名爲X - 轉發,源端口與mod_rewrite的請求頭+ mod_headers中

RewriteEngine on 
RewriteRule .* - [E=REMOTE_PORT:%{REMOTE_PORT},NE] 
RequestHeader set X-Forwarded-SourcePort %{REMOTE_PORT}e 

Apache將轉發與客戶端源端口到後端服務器的請求,所以您可以從應用程序獲取X-Forwarded-SourcePort請求標頭。

+0

添加,如果使用虛擬主機,在每個<虛擬主機>部分添加這些內容,RewriteEngine On RewriteOptions Inherit – 2013-03-05 06:33:13