web-dev-qa-db-ja.com

mod_proxyリダイレクトで元のリクエストURLを保持する

インターネット(外部)および社内(内部)からアクセスできる環境で、サーブレットコンテナ(ポート8080)でWebアプリケーションを実行しています。

http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication

着信(外部/内部)リクエストは、Apache httpサーバーとmod_proxyを使用してサーブレットコンテナーにリダイレクトされます。構成は次のようになります。

ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /MyApplication http://localhost:8080/MyApplication

現在、いくつかのMyApplication応答が元の要求URLに依存しているという問題に直面しています。具体的に:WSDLドキュメントには、schemaLocation="<RequestUrl>?xsd=MyApplication.xsd"要素。

私の現在の構成では、常に次のようになります

<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>

しかしそれは

External Request: <xs:import namespace="..." schemaLocation="http://external.foo.bar/MyApplication?xsd=MyApplication.xsd"/>
Internal Request: <xs:import namespace="..." schemaLocation="http://internal.foo.bar/MyApplication?xsd=MyApplication.xsd"/>

これは一般的な要件だと思います。しかし、私はApache httpサーバーとそのモジュールの構成の専門家ではないので、誰かが(詳細な)助けを提供できたらうれしいです。

前もって感謝します!

22
FrVaBe

Apache> = 2.0.31を実行している場合は、_ ここ のようにProxyPreserveHostディレクティブを設定してみてください。

これにより、元のホストヘッダーがmod_proxyを介してアプリケーションに渡されます。通常、リクエストURLはホストヘッダーを使用して(サーブレットコンテナー内で)再構築されるため、スキーマの場所は、「前」のホストとパスの情報を使用してビルドする必要があります。プロキシ。

(完全を期すためにここにも掲載しています)

27
jCoder

元のホスト名とプロキシされたホスト名の両方を保持したい場合は、別の方法を次に示します。

Mod_proxyを使用している場合は、Apache構成でProxyPreserveHostを無効にします。 mod_proxyを含むほとんどのプロキシサーバーでは、アプリケーションのX-Forwarded-Hostヘッダーを読み取ります。これは、HTTP要求によって提供された元のHostヘッダーを識別します。

ここで設定されているヘッダーmod_proxy(および可能な他の標準プロキシサーバー)について読むことができます:

http://httpd.Apache.org/docs/2.2/mod/mod_proxy.html

6
ricosrealm

Apacheでmod_rewriteを実行して、完全なURLをクエリパラメータまたはフラグメントの一部としてエンコードできるはずです。これがどれほど簡単かは、着信クエリの一部としてどちらを使用するかによって異なります。

たとえば、http://external.foo.bar/MyApplicationhttp://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplicationに書き換えられ、ProxyPassに渡されて取り除かれる場合があります。

少しハック、はい、そしておそらくリライトとプロキシを正しい順序で動作させ、互いに干渉させないようにするには少しトリッキーですが、動作するはずです。

1
Seth Robertson