我可以強制 apache 的 mod_proxy 通過主機名而不是 IP 連接到遠端伺服器嗎?
我正在將 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 <file>
選項,如下所示: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) => 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 或其他)發出您的請求,停止
tcpdump
with^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:
標頭和其他有用資訊。看看它的外觀,如果你沒有發現明顯的東西,請回到這裡。