2012-09-13 18 views
1

我試圖獲得較舊的Apache(2.2.17)來代理:如何在Apache中代理查詢字符串URL?

http://foo.com/proxy/?url=http%3A%2F%2Fbar.com%2foo

到:

http://bar.com/foo

我:

的RewriteCond%{QUERY_STRING }^url =(。*)$
RewriteRule ^/proxy /%1? [P,L]

不幸的是,這導致了Apache的試圖代理URL編碼值(日誌輸出):

(3)將圖案 '^ /代理/' 到URI '/代理/'
(4)RewriteCond:input ='url ='http%3A%2F%2Fbar.com%2foo''pattern ='^ url =(。*)$'=> matched
(2)rewrite'/ proxy /' - >''http%3A%2F%2Fbar.com%2foo'?'
(3)split uri ='http%3A%2F%2Fbar.com%2foo'? - > uri ='http%3A%2F%2Fbar.com%2foo',args =
(2)強制代理吞吐量與http://foo.com/'http%3A%2F%2Fbar.com%2foo'
- 帶有代理請求代理:http://foo.com/'http%3A%2F%2Fbar.com%2foo'[確定]

所以,看起來有兩個問題。一個是結果中有撇號,另一個是結果不是URL解碼。我假定Apache的原因是預先加入了原始協議://主機是它沒有將結果看作URL。

回答

3

如果你有機會獲得虛擬主機/服務器配置(和它看起來像你這樣做),你可以配置內置的重寫地圖apache的之一,以取消轉義爲您提供:

RewriteMap unescape int:unescape 

然後你可以使用地圖在你的規則中:

RewriteCond %{QUERY_STRING} ^url=(.*)$ 
RewriteRule ^/proxy/ ${unescape:%1}? [P,L] 
+0

修復了URL解碼問題。我現在得到: http://foo.com/'http://bar.com/foo' 我該如何擺脫撇號,並得到它來代理真正的URL? –

+0

@JayVachhani根本不應該在那裏,這在我的apache安裝中適用於我。除非在查詢字符串中有url,否則我想你可以通過將正則表達式改爲:'^ url ='?(。*?)'?$' –

相關問題