2011-11-15 65 views
15

我使用mod重寫來掩蓋我的應用程序的上下文根。例如,如果我使用mod重寫,是否需要使用ProxyPassReverse?

RewriteRule ^/directory/(.*) balancer://appcluster/directory/$1 [P] 

的appcluster看起來是這樣的:

<Proxy balancer://appcluster> 
BalancerMember http://localhost:8080/App route=app_01 keepalive=On loadfactor=1 ttl=300 min=3 smax=5 max=15 

ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On 
</Proxy> 

我需要使用ProxyPassReverse呢?我用它,因爲我的舊的Web服務器的代碼是這樣的:

ProxyPass /App balancer://appcluster lbmethod=byrequests stickysession=JSESSIONID|jsessionid timeout=120 nofailover=On 

ProxyPassReverse /App http://localhost:9013/App 

回答

47

ProxyPassReverse被用來改變應用程序(appcluster)到Apache發送的頭,阿帕奇將它的瀏覽器。例如,如果應用程序位於http://localhost:9013/,並且它試圖將瀏覽器重定向到/new_location/,則它將使用重定向和位置標頭http://localhost:9013/new_location/進行響應,並且Apache將採取此操作並將其發送給瀏覽器。問題是,瀏覽器(假設它在其他地方)然後嘗試發送請求到http://localhost:9013/new_location/,並且出現錯誤。

ProxyPassReverse所做的是攔截這些頭並重寫它們,以便它們與執行代理的Apache服務器的外觀相匹配。所以,如果我的Apache服務器託管http://myhost.com/,我有一個ProxyPass指向/http://localhost:9013/App,如果坐在localhost上的應用:9013返回重定向到http://localhost:9013/App/new_location/,我需要使用ProxyPassReverse以便它能夠通過Apache之前改寫爲http://myhost.com/new_location/將請求發送回瀏覽器。

如果你沒有發出重定向,這不會是一個問題,但是如果返回301/302重定向,它不會有什麼問題。至於mod_rewrite,RewriteRule適用於去應用程序的請求,而不是來自應用程序的響應。所以他們是互相排斥的事件。

+0

所以我的代理通過反向如下:ProxyPassReverse /應用程序/目錄http://本地主機:9013 /應用程序/目錄? –

+0

我認爲你所擁有的是正確的。儘管我已經看到人們以這樣的方式使用它,其中右側的url是外部域而不是localhost。我的Jboss部署使用ProxyPassReverse就像你擁有它,它們重定向就好。 –

+0

非常好的關於ProxyPassReverse的解釋和對它的需求。 @jon lin ..謝謝 –

相關問題