2010-03-16 53 views
6

我想根據請求頭在Apache中將請求轉發到不同的轉發代理。我認爲最好的方式是使用mod_rewrite,但它只能使用在同一個apache配置中定義的反向代理。使用不同的轉發代理的Apache重寫請求

我也檢查了mod_proxy的ProxyRemote屬性,但它不能根據條件使用,只能根據請求url的使用。

我需要這樣的東西:

如果X-CUSTOM-頭是價值1 - 轉發代理P2>轉發請求 - 轉發代理P1 如果X-CUSTOM-頭是價值2>轉發請求

任何人都設法做出類似的東西?

感謝, 阿林

+0

我面臨着類似的問題。我還需要一個轉發請求,而不是一個反向請求,因爲服務器本身不佔用資源,但應從互聯網上獲取它們。你有沒有想出一個解決方案呢? – 2011-09-04 12:34:46

+0

這個要求畢竟被刪除了,所以我沒有機會在生產中測試解決方案。 – Alin 2011-10-25 20:39:28

回答

2

我找到了一個解決方案,它不是很優雅。它也涉及到第二臺服務器上的一些適應。

它來自一個項目,我有一個類似的問題,但需要服務器「完全」(由使用數據庫資源的自定義腳本選擇)。

這應該至少工作(我運行我的URL通過重寫映射進行修改,我調整它使用標頭使用RewriteCond)。

# example for server number "5" in your remote proxy network 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule http://([a-z0-9\.]+)/(.*) http://$1.5.server.yourdomain.com$1 [P] 
ProxyRemoteMatch .*\.5\.server\.yourdomain\.com.* http://5.server.yourdomain.com:80 

您基本上調整了網址,以便它是您的第二臺服務器的子域,然後再將其刪除。
這部分進入第二(遠程代理服務器)上:

<ProxyMatch "http://.*\.[0-9]+\.server\.yourdomain\.com/.*"> 
    RewriteEngine on 
    RewriteRule (proxy:http[s]?://.+)\.[0-9]+\.server\.premiumize\.me(.+) $1$2 
    ... your code ... 
</ProxyMatch> 
0

你應該能夠通過使用RewriteCond指令與驗證%實現它{HTTP:頭}。

嘗試以下操作:

RewriteEngine On 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule (.*) http://p1.example.com$1 [P] 
ProxyPassReverse/http://p1.example.com 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
RewriteRule (.*) http://p2.example.com$1 [P] 
ProxyPassReverse/http://p2.example.com 

希望它能幫助。 :)

+0

這是優雅的,但提問者表示他需要轉發代理請求。所以服務器p1和p2應該從外部第三方來源提供資源,而不是直接從他們那裏提供資源。 – 2011-09-04 12:34:08

1

試試這個:

# Prevents Apache from functioning as a forward proxy server (where you don't want) 
ProxyRequests Off 
# Preserve Host in http protocol on destination server 
ProxyPreserveHost On 
<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 
# enable rewrite engine 
RewriteEngine On 
# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
# execute forward proxy 
RewriteRule (.*) http://server1/$1 [P,L,QSA] 

# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
# execute forward proxy 
RewriteRule (.*) http://server2/$1 [P,L,QSA]