Apache-2.2

我可以強制 apache 的 mod_proxy 通過主機名而不是 IP 連接到遠端伺服器嗎?

  • April 25, 2012

我正在將 Apache2 設置為遠端站點的反向代理。假設遠端站點是http://app.remotesite.com。這是我的虛擬主機配置中的一個片段:

ProxyPass /pxy/ http://app.remotesite.com/

所以這應該接受一個像http://app.mysite.com/pxy/search?q=abc>這樣的請求,並將它作為<http://app.remotesite.com/search?q=abc傳遞。

嘗試此操作時收到“錯誤請求”。根據 /var/log/apache2/error.log 中的輸出,它正在正確地執行代理,但看起來當它連接到遠端站點時,它使用其 IP 地址執行此操作。如果我使用該 IP 地址(列印在 error.log 中)並使用它發出請求,例如http://[IP地址]/search?q=abc,我會收到相同的“錯誤請求”錯誤。我的假設是遠端站點依賴主機名來正確處理請求,但 mod_proxy 沒有發送它。我知道 ProxyPreserveHost 設置,但這是為了在代理請求中保留原始主機名(在本例中為 app.mysite.com),這不是我想要的。

誰能建議我強制 mod_proxy 在其請求中使用遠端站點的主機名的方法?或者,如果我的假設沒有意義,請指出還有什麼問題?

你的假設可能是不正確的。 mod_proxy使用您在代理 URL 中提供的主機名進行連接。

如果您http://app.remotesite.com/search?q=abc在命令行上使用請求curl,您會得到預期的響應嗎?mod_proxy如果是這樣,那麼一個很好的起點是查看 curl 產生的請求與發送過來的請求之間的差異。

要查看curl正在執行的操作,您可以使用該--trace-ascii &lt;file&gt;選項,如下所示:

curl --trace-ascii trace.out http://app.remotesite.com/search?q=abc

這將產生trace.out如下所示的輸出:

== Info: About to connect() to google.com port 80 (#0)
== Info:   Trying 74.125.228.8... == Info: connected
== Info: Connected to google.com (74.125.228.8) port 80 (#0)
=&gt; Send header, 165 bytes (0xa5)
0000: GET / HTTP/1.1
0010: User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7
0050:  NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
0084: Host: google.com
0096: Accept: */*
00a3: 

從 Apache 中獲取相同的資訊有點棘手。我會使用tcpdump,這是一個數據包擷取工具。像這樣開始擷取數據包:

tcpdump -w packets -s 1500 port 80 and host app.remotesite.com

在 tcpdump 執行時,從瀏覽器(或 curl 或其他)發出您的請求,停止tcpdumpwith ^C,然後像這樣檢查文件:

strings packets

這會讓你得到類似的東西:

{GET / HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
Host: google.com
Accept: */*

這將顯示所請求的 URL、Host:標頭和其他有用資訊。看看它的外觀,如果你沒有發現明顯的東西,請回到這裡。

引用自:https://serverfault.com/questions/383031