Apacheドキュメントの Reverse Proxy Request Headers セクションと セクションを含む_X-Forwarded-*
_ヘッダーに関する興味深い読み物を見つけました。 )X-Forwarded-Forに関するウィキペディアの記事 。
という事は承知しています:
X-Forwarded-For
_は、プロキシに接続したクライアントのアドレスを提供しますX-Forwarded-Port
_は、クライアントがプロキシで接続するポートを提供します(例、_80
_または_443
_)X-Forwarded-Proto
_は、クライアントがプロキシへの接続に使用したプロトコルを提供します(http
またはhttps
)X-Forwarded-Host
_は、クライアントがプロキシに送信したHost
ヘッダーのコンテンツを提供します。これらはすべて理にかなっています。
ただし、_X-Forwarded-Host
_の実際の使用例を理解することはできません。別のポートで、または別のスキームを使用して接続を繰り返す必要があることを理解していますが、ターゲットへのリクエストを繰り返すときにプロキシサーバーがHost
ヘッダーを変更する理由はサーバー?
APIのフロントエンドとして Apigee のようなフロントエンドサービスを使用する場合、ApigeeはバックエンドDNSが何であれ設定され、nginxとアプリスタックは、最初に呼び出されたホスト名ではなく、ホストヘッダーをバックエンドDNS名としてのみ表示します。
IBMポータルを使用して問題が発生しました。
私の場合、問題はIBMポータルに次のようなリソースのURLを取得するRESTサービスがあることでした:{"url": " http://internal.Host.name/path " }
どうした? internalHostNameが存在するため、イントラネットから入力する場合はすべて正常に機能しますが、ユーザーがインターネットから入力する場合、プロキシはホスト名を解決できず、ポータルがクラッシュします。
IBMポータルの修正は、X-FORWARDED-Hostヘッダーを読み取ってから、応答を{"url": " http://internet.Host.name/path "のようなものに変更することでした。 }
2番目の応答では、内部ではなくインターネットを使用しています。
これが私が今日取り組んだシナリオです。ユーザーは、「 https://neaturl.company.com 」を使用して特定のアプリケーションサーバーにアクセスします。URLはリバースプロキシを指します。次に、プロキシはSSLを終了し、ユーザーの要求を「 http://192.168.1.1:5555 」のURLを持つ実際のアプリケーションサーバーにリダイレクトします。問題は、アプリケーションサーバーが絶対パスを使用してユーザーを同じサーバー上の他のページにリダイレクトする必要がある場合、後者のURLを使用しており、ユーザーがこれにアクセスできないことです。 X-Forwarded-Host(+ X-Forwarded-ProtoおよびX-Forwarded-Port)を使用すると、プロキシがアプリケーションサーバーにユーザーが最初に使用したURLを伝え、サーバーが応答で正しい絶対パスを生成し始めました。
この場合、アプリケーションサーバーを停止して絶対URLを生成したり、「パブリックURL」用に手動で構成したりするオプションはありませんでした。
1つの例は、特定のホストをブロックし、外部ブロックページにリダイレクトするプロキシです。実際、学校のフィルターがこれを行うことはほぼ確実です...
(そして、元のHost
をHost
として渡すだけではない理由は、一部のサーバー[Nginx?]が間違ったHost
へのトラフィックを拒否するためです。)
「x-forwarded-Host」の必要性については、いくつかの内部ホスト(内部ネットワーク)とそれらのホストとインターネットの間にあるリバースプロキシがある仮想ホスティングシナリオを考えることができます。要求されたホストが内部ネットワークの一部である場合、要求されたホストはリバースプロキシIPに解決され、Webブラウザーは要求をリバースプロキシに送信します。このリバースプロキシは適切な内部ホストを見つけ、クライアントから送信された要求をこのホストに転送します。その際、リバースプロキシは、ホストフィールドを内部ホストに一致するように変更し、x-forward-Hostをクライアントが要求した実際のホストに設定します。リバースプロキシの詳細については、このウィキペディアのページをご覧ください http://en.wikipedia.org/wiki/Reverse_proxy 。
X-forwarded-forヘッダーの詳細と、Webサーバーがプロキシサーバーの使用を検出する方法を示す簡単なデモpythonスクリプトについては、この投稿を確認してください: x-forwarded -説明付き
X-Forwarded-Hostは私の命を救ったばかりです。 CDN(または「ツリー」に移動する場合はリバースプロキシ)は、ユーザーがホストヘッダーで使用するOriginを決定します。したがって、CDNは同じHostヘッダーを使用してOriginにアクセスすることはできません。そうしないと、CDNはOriginに行くのではなくループで自分自身に行きます。したがって、CDNは、オリジンからコンテンツを取得するホストヘッダーとしてIPアドレスまたはダミーのFQDNを使用します。さて、Originはコンテンツが要求されるホストヘッダー(ウェブサイト名)が何であるかを知りたいかもしれません。私の場合、1つのOriginが2つのWebサイトを提供していました。
別のシナリオでは、ホストURLにアプリのライセンスを供与し、n> 1台のサーバー間で負荷分散を行います。