HTTP 1.1のHost:ヘッダーの保持

HTTP 1.1リクエストには、多くの場合Host:ヘッダーが組み込まれており、クライアント・リクエストのホスト名が含まれます。これは、サーバーが単一のIPアドレスまたはインタフェースを使用して、複数のDNSホスト名に対するリクエストを受け入れることがあるためです。

Host:ヘッダーによって、クライアントがリクエストするサーバーが識別されます。リバース・プロキシがクライアントとターゲット・サーバーの間のHTTP 1.1リクエストをプロキシする際には、リクエスト時にHost:ヘッダーをアウトバウンド・リクエストに追加する必要があります。ターゲット・サーバーに送信されるHost:ヘッダーは、クライアントから受け取ったHost:ヘッダーと同じである必要があります。ターゲット・サーバーに直接アクセスする際のHost:ヘッダーであってはなりません。

アプリケーション・サーバーで、絶対パスの完全修飾されたURL(リダイレクトURLなど)、またはイメージやCSSファイルへの絶対パスを作成する必要がある場合、クライアントが後続のリクエストで使用できるように正確なホスト名を提供する必要があります。

たとえば、あるJavaアプリケーション・サーバーでは、クライアント側のリダイレクトがブラウザ(HTTP 302の移動先)に送信されます。ServletRequest.getServerName()メソッドを使用してリクエスト内のホスト名がフェッチされた後、Host:ヘッダーが作成されます。

クライアントによって送信されたURLはhttp://mystudio/web/myappです。この場合、リバース・プロキシによって生成される実際の内部ターゲットURLはhttp://studioserver1:8080/studio/web/myappになります。

ターゲット・サーバー特有の構成がなく、リバース・プロキシがHost:ヘッダーを保存する場合、このヘッダーの値は次のようになります。
Host: http://mystudio
リバース・プロキシがHost:ヘッダーを保存しない場合は、次の結果になります。
Host: http://studioserver1:8080

後者の場合、ヘッダーで実際のターゲット・サーバーのホスト名が使用されるときに、クライアントでstudioserver1へのアクセスやホスト名の解決ができないことがあります。また、次回のリクエストでリバース・プロキシがバイパスされるため、セキュリティ上の問題が生じることがあります。

Host:ヘッダーがクライアントで正しいことを保証できない場合は、Webサーバーまたはアプリケーション・サーバーを対象に構成して、正確な絶対URLがレンダリングされるようにしてください。

ほとんどのリバース・プロキシ・ソリューションには、Host:ヘッダーの保持を可能にする構成オプションが存在するはずです。