web-dev-qa-db-ja.com

mod_rewriteを使用している場合、ProxyPassReverseを使用する必要がありますか?

Mod rewriteを使用して、アプリケーションのコンテキストルートをマスクしています。例えば、

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を使用する必要がありますか?以前のウェブサーバーコードは次のようになっていたため、以前はこれを使用していました。

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

ProxyPassReverse /App http://localhost:9013/App
16
Scoota P

ProxyPassReverseは、Apacheがブラウザーに送信する前に、アプリ(appcluster)からApacheに送信されるヘッダーを変更するために使用されます。たとえば、アプリが http:// localhost:9013 / にあり、ブラウザを_/new_location/_にリダイレクトしようとすると、応答します。 http:// localhost:9013/new_location / のリダイレクトと場所のヘッダーを使用すると、Apacheはこれを取得してブラウザーに送信します。問題は、ブラウザが(別の場所にあると仮定して)次に http:// localhost:9013/new_location / にリクエストを送信しようとし、エラーが発生することです。

ProxyPassReverseが行うことは、これらのヘッダーをインターセプトし、プロキシを実行しているApacheサーバーがどのように見えるかと一致するようにヘッダーを書き換えることです。したがって、Apacheサーバーが http://myhost.com/ をホストしていて、_/_が http:/を指すProxyPassがある場合/ localhost:9013/App 、localhost:9013にあるアプリケーションが http:// localhost:9013/App/new_location / へのリダイレクトを返す場合、Iリクエストをブラウザに送り返す前に、Apacheによって http://myhost.com/new_location/ に書き換えられるように、ProxyPassReverseを使用する必要があります。

リダイレクトを発行していない場合は問題にはなりませんが、301/302リダイレクトが返された場合にリダイレクトを発行しても問題はありません。 mod_rewriteに関する限り、RewriteRuleはアプリに送信されるリクエストに適用され、アプリからのレスポンスには適用されません。したがって、これらは相互に排他的なイベントです。

50
Jon Lin