[解決済み] HTTPの "Host "ヘッダーとは何ですか?
質問
HTTPリクエストの送信時にTCPコネクションが既に確立されていることから、IPアドレスとポートは暗黙のうちに知られています -- TCPコネクションはIP + ポートです。
では、なぜ
Host
ヘッダを作成します。 これは、TCP 接続に含まれる IP アドレスにマッピングされたホストが複数ある場合にのみ必要なのでしょうか?
どのように解決するのですか?
その
Host
ヘッダーは、ウェブサーバーにどの
バーチャルホスト
を使用します(設定されている場合)。同じバーチャルホストに複数の
エイリアス
(=ドメインとワイルドカードドメイン)。この場合、アドレスされた異なるドメインに基づいて異なる動作を提供したい場合は、Webアプリケーションでそのヘッダーを手動で読み取る可能性が残っています。これは、ウェブサーバーで、次のように設定することができるからです(私の誤解でなければ、必ず設定しなければなりません)。
1
vhostをデフォルトのホストとして使用します。このデフォルトホストは
host
ヘッダが設定されたバーチャルホストのどれとも一致しない場合にのみ使用できます。
ということですね。複数のホストと言うと誤解を招くかもしれませんが、あなたは正しく理解しています。ホスト(アドレス指定されたマシン)は同じですが、実際にIPアドレスに解決されるものは、異なるものです。
ドメイン名
(サブドメインも含む)と呼ばれるものです。
ホスト名
(ただし、ホストではありません!)。
この仕様により、初期のSSLでは、クライアントが指定したドメインに対応する証明書をウェブサーバーが配信しなければならないという問題がありました。しかし、どの証明書を使うか知るためには、ウェブサーバーはアドレスされたホスト名をあらかじめ知っている必要がありました。しかし、クライアントはその情報を暗号化された経路でしか送らないので(つまり、証明書がすでに送信された後)、サーバーはあなたがデフォルトのホストを閲覧していると仮定しなければなりませんでした。つまり、1つのIPアドレス/ポートの組み合わせにつき、1つのSSL保護されたドメインが存在することになります。
これを克服したのが サーバー名表示 しかし、サーバー名が再びプレーンテキストで転送されるため、中間者(man-in-the-middle)からは どのホスト名 に接続しようとしている。
ウェブサーバーはサーバー名表示からホスト名を知っているはずですが
Host
ヘッダーが廃止されたわけではありません。なぜなら、Server Name Indicationの情報はTLSハンドシェイクの中でしか使用されないからです。セキュアでない接続では、Server Name Indicationは全く存在しないので
Host
ヘッダはまだ有効(かつ必要)です。
もう一つの面白い事実:すべてではないにせよ、ほとんどのウェブサーバーは、HTTPリクエストに正確に1つの
Host
ヘッダは、たとえデフォルトのvhostしか設定されていないため省略可能であったとしても。つまり、http(get)リクエストに最低限必要な情報は、最初の行に含まれる
METHOD
RESOURCE
と
PROTOCOL VERSION
と、少なくとも
Host
ヘッダはこのようになります。
GET /someresource.html HTTP/1.1
Host: www.example.com
で MDN Documentation on "Host" header というような表現をしています。
<ブロッククオートHostヘッダーフィールドは、すべてのHTTP/1.1リクエストメッセージで送信されなければなりません。A 400 (Bad Request) ステータスコードは、HTTP/1.1 リクエストに送信されます。 メッセージは、Hostヘッダーフィールドを欠くか、または2つ以上含んでいます。
ダレル・ミラー氏が言及したように、完全な仕様は以下のサイトで見ることができます。 RFC7230 .
関連
-
[解決済み] 正しいJSONコンテンツタイプは何ですか?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] 403 Forbiddenと401 UnauthorizedのHTTPレスポンスの比較
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] cURL呼び出しによるHTTPリクエストを使用してヘッダーを送信する方法は?
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] カスタムHTTPヘッダー:命名規則
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み] Cache-Control: privateとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HTTPポストで文字+が%2Bに変換される
-
[解決済み] 404ヘッダー - HTTP 1.0か1.1か?
-
[解決済み] HTTPステータスコード0 - Error Domain=NSURLErrorDomain?
-
[解決済み] X-REQUEST-ID httpヘッダーとは何ですか?
-
[解決済み] OPTIONSリクエストを送信する理由と、それを無効にする方法を教えてください。
-
[解決済み] POSTとGETの違いは何ですか?[重複しています]。
-
[解決済み] bash/shellスクリプトからhttp応答コードを評価する方法は?
-
[解決済み】302と307のリダイレクトの違いは何ですか?
-
[解決済み】http getリクエストにヘッダーを設定する方法は?
-
[解決済み] REST DELETEは本当にべき乗なのか?