HTTP要求が送信されたときにTCP接続がすでに確立されていると仮定すると、IPアドレスとポートは暗黙的に認識されています - TCP接続はIP +ポートです。では、なぜHost
ヘッダが必要なのでしょうか。 TCP接続に含まれるIPアドレスに複数のホストがマッピングされている場合にのみ必要ですか。
Host
ヘッダーは、使用する仮想ホスト(セットアップされている場合)をWebサーバーに通知します。複数のエイリアス(=ドメインとワイルドカードドメイン)を使用して、同じ仮想ホストを持つこともできます。この場合、アドレス指定された異なるドメインに基づいて異なる動作を提供する場合、Webアプリケーションでそのヘッダーを手動で読み取る可能性があります。これは、Webサーバーでonevhostをデフォルトのホストに設定できるため(そして、私が間違っていなければならない場合)に設定できるためです。このデフォルトのvhostは、Host
ヘッダーが構成済みの仮想ホストのいずれとも一致しない場合に使用されます。
つまり、「複数のホスト」と言うのは多少誤解を招くかもしれませんが、正しく理解できます。ホスト(アドレス指定されたマシン)は同じで、実際にIPアドレスに解決されるものは異なりますdomain names(サブドメインを含む)は、hostnamesとも呼ばれます(ホストではありません!)。
質問の一部ではありませんが、面白い事実:Webサーバーはクライアントが対処したドメインに対応する証明書を配信する必要があるため、この仕様は初期のSSLで問題を引き起こしました。ただし、どの証明書を使用するかを知るために、Webサーバーは事前にアドレス指定されたホスト名を知っている必要があります。ただし、クライアントはその情報を暗号化されたチャネルのみで送信するため(つまり、証明書が既に送信された後)、サーバーはデフォルトのホストを参照したと想定する必要がありました。つまり、IPアドレス/ポートの組み合わせごとに1つのSSLで保護されたドメインを意味していました。
これは Server Name Indication ;で克服されました。ただし、サーバー名がプレーンテキストで再び転送されるようになり、プライバシーが侵害されるため、すべての中間者はwhich hostname接続しようとしています。
Webサーバーはサーバー名表示からホスト名を知っていますが、サーバー名表示情報はTLSハンドシェイク内でのみ使用されるため、Host
ヘッダーは廃止されません。セキュリティで保護されていない接続では、サーバー名の表示がまったくないため、Host
ヘッダーは引き続き有効です(必要です)。
別の面白い事実:ほとんどのWebサーバー(すべてではない場合)は、デフォルトのvhostのみが構成されているため省略できる場合でも、Host
ヘッダーが1つだけ含まれていない場合、http-requestを拒否します。つまり、http get-)requestに最低限必要な情報は、METHOD
RESOURCE
およびPROTOCOL VERSION
と少なくともHost
- headerを含む最初の行です。 :
GET /someresource.html HTTP/1.1
Host: www.example.com
詳細については、---(ホストヘッダーに関するMDNドキュメント を参照してください。
ホストヘッダーフィールドは、すべてのHTTP/1.1要求メッセージで送信する必要があります。 400(Bad Request)ステータスコードは、Hostヘッダーフィールドがないか、複数のHTTP/1.1要求メッセージに送信されます。
Darrel Millerが述べたように、完全な仕様は RFC72 にあります。
HTTPヘッダーの意味と目的を理解しようとするときは、常に権威ある情報源に行くことをお勧めします。
リクエストの "Host"ヘッダフィールドは、ホストとポートを提供します。
ターゲットURIからの情報。オリジンサーバが
複数の要求を処理しながらリソースを区別する
単一のIPアドレス上のホスト名。
HTTP 1.1、Hostヘッダーは、IPアドレスとポート番号に加えて、Webドメイン、またはMicrosoftが呼んでいるアプリケーションサーバーを一意に識別するために使用できる3番目の情報です。たとえば、URL www.example.comのHostヘッダー名はwww.example.comです。 HTML 3.0以降のブラウザはHTTP 1.1をサポートしています。ブラウザには、ブラウザがサーバに送信するリクエストヘッダのlocationフィールドに指定したHostヘッダ名が含まれています。要求ヘッダーにHostヘッダー名を指定しないと、ルートWebドメインがデフォルトのWebサーバーとして機能します。