24

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

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

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

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サーバーとそのモジュールの構成の専門家ではないので、誰かが(詳細な)助けを与えることができれば幸いです。

前もって感謝します!

4

3 に答える 3

28

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

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

(完全を期すためにここにも掲載)

于 2011-05-23T18:45:27.550 に答える
1

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

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

はい、ちょっとしたハックです。おそらく、書き換えとプロキシを正しい順序で動作させ、互いに干渉しないようにするのは少し難しいですが、動作するはずです。

于 2011-05-20T19:59:47.467 に答える