コンマ区切りの X-FORWARDED-HOST 値を適切に処理していないように見えるサードパーティのサーバーを使用しています。要約すると、プロキシ経由で到達した場合のように、無効な URL を含む HTML ページを生成します (このシナリオについては、http: //forums.arcgis.com/threads/66787-Multiple-Reverse-Proxies?p=306157http://externalsite_address, internalsite_address/blah/blah/blah
で詳しく説明されています)。)。組織的にはこのサードパーティのサーバーを使用せざるを得ず、オープン ソースではないため、自分たちで修正することはできません。私はこの問題を克服するために 2 週間努力してきましたが、私たちの組織の Web アーキテクチャを考えると、まだ思い通りに動作させることができません。これらの HTML の URL で確認したいのは、.http://externalsite_address/blah/blah/blah
テスト環境では、外部サイトとして機能するサーバーに ProxyPreserveHost をオンに設定し、内部サイトに "RequestHeader unset X-Forwarded-Host" ディレクティブを追加することで、必要に応じて動作させることができることを学びました。これを行うと、すべてが正常に機能します。残念ながら、実際の外部サイトの構成は、組織内の他のすべてのサーバーのプロキシ サーバーであり、組織内の他の内部サーバーに存在する他のアプリケーションに影響を与える可能性があるため、このようなサーバー構成の変更を導入する許可を拒否されました.
ProxyPreserveHost のドキュメントを見ると、VirtualHost のコンテキスト内でも設定できることがわかりました。ただし、この場合、そのようなものを定義する方法がわかりません。組織へのすべての Web トラフィックは、この externalsite_address を介してルーティングする必要があり、次のように、プロキシを介して特定の internalsite_address に適切なトラフィックを転送する RewriteRule が 1 つだけあります。
RewriteRule ^/atlas(.*)$ http://internalsite_address/atlas$1 [P,L,QSA]
ProxyPreserveHost On を含む VirtualHost として定義できる方法はありますか? これまでに読んだことはすべて、VirtualHost には別のアドレスまたはポートが必要であり、組織のものと同じアドレスでは使用できないことを示唆しています。つまり、 経由http://externalsite_address/atlas
で内部サーバーにアクセスする人がまだ必要なので、ここで VirtualHost をセットアップすることはオプションではないと思います...私は正しいですか、それともドキュメントを誤解しているだけですか?
ProxyPreserveHost ディレクティブはサーバー構成または VirtualHost 内でのみ有効であるため使用できないと仮定して、内部サーバーのみでこれを達成する方法を見つけようとしています。インクルードでApacheディレクティブをオフにしてからオンにできますか? このコードを提案しました:
<Proxy "http://${build.replace.host}/">
RequestHeader set Host ${build.replace.external.host}
</Proxy>
RewriteRule ^/proxypath/ http://${build.replace.external.host}/path/to/resource.html [P]
ProxyPassReverse /proxypath/ http://${build.replace.external.host}/path/to/resource.html
ただし、外部ユーザーは externalsite_address からアクセスする必要がありますが、内部ユーザーは internalsite_address から直接アクセスできる必要があるため、Host 値を適切に設定する方法がわかりませんでした。そのため、その Host 値が言うべきこともあれば、そうあるべきこともありhttp://externalsite_address/
ますhttp://internalsite_address/
。本当に、私ができるようにしたいのは(しかし、それが可能かどうか、またはそれが可能かどうかさえわかりません)、X-FORWARDED-HOST値が設定されているかどうかを何らかの方法で判断し、そうであれば、ヘッダーのホストを文字列にリストされている最初の値を取得し、必要に応じて ProxyPreserveHost をオンにして、後続のプロキシを通じて値が維持されるようにします。
これを解決するために私が見つけた別の方法は、外部サーバーに別のプロキシ定義を導入し、次のように特定の URL を指定してサードパーティ サーバーに直接アクセスすることです (「atlas」の後の「rest」に注意してください。最終的にはそのサーバーによって処理されます):
RewriteRule ^/atlas/rest/(.*)$ http://internalsite_address/atlas/rest/$1 [P,L,QSA]
残念ながら、これを行うには、ファイアウォールを介してシステム アーキテクチャの別のゾーンに穴を開ける必要があり、それも拒否されています。外部サーバーは内部サーバー (同じゾーンにある) にプロキシすることができ、内部サーバー (外部から直接見えない) は、要求が他のすべてのサーバーで取得できるように定義されたすべてのアクセス許可を持つ唯一のサーバーです。別のゾーンに存在する Web アプリケーションを配信するために使用されます。これを正当化するように私に尋ねないでください。アーキテクチャは私たちに指示されたものであり、私たちはその中でどのように機能するかを理解しようとしています.
私がここで達成しようとしていることを達成するのに役立つ何かを誰かが提案できますか? 私がまだ見つけていないものでも?または、代わりに、外部サーバーで VirtualHost を定義して、内部サーバーにルーティングされる要求に対してのみ ProxyPreserveHost フラグを設定できる方法はありますか?
本当に、この時点で、どんな手がかりでもありがたいです...
乾杯、jtm