-
Notifications
You must be signed in to change notification settings - Fork 0
MS_HostHeader
- 戻る(IIS)
- HTTP リクエスト中の HTTP ヘッダに含まれる「
Host: <host>:<port>」という値。- 参考
- Host - HTTP | MDN
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Host
- Host - HTTP | MDN
- 参考
- 以下の 2 つの用途で利用される。
補足(
Hostヘッダーが HTTP/1.1 で必須になった理由): HTTP/1.0 では
Hostヘッダーが任意だった。これは、【HTTP/1.0 の前提】 1 つの IP アドレス = 1 つの Web サイト GET /index.html HTTP/1.0 ↑ 宛先 IP に到達した時点でどのサイトか自明だったという時代の設計である。
しかし IPv4 アドレスの枯渇により、
1 つの IP で複数サイトを運用する必要が生じた。【HTTP/1.1】 Host ヘッダーで宛先サイトを明示する(必須) GET /index.html HTTP/1.1 Host: www.example.jp ← これでサーバがサイトを判別するこれが名前ベースの仮想ホストであり、
本ページの 2 つの用途はいずれもこの仕組みの応用である。なお、HTTP/2 以降では
:authority疑似ヘッダーが
同じ役割を担う(HTTP/2)。
NAPT では、
- グローバル IP アドレス+ポートを
- プライベート IP アドレス+ポートに
振り分ける。
リバース・プロキシであれば、ホストヘッダーを見て、
プライベート IP アドレス+ポートに振り分けることができる。
補足(NAPT とリバース プロキシの決定的な違い): この対比が
本節の要点である。どの層の情報で振り分けるかが違う。
NAPT リバース プロキシ 層 L4(IP・ポート) L7(HTTP) 判断材料 宛先ポート番号 Hostヘッダー、URL パス必要なもの サイトごとに別ポート 1 ポートで複数サイト 利用者から見て URL にポート番号が出る 出ない TLS 素通し 終端できる(=中身を見て振り分けられる) つまり、NAPT では
https://example.jp:8443/ → 内部サーバA https://example.jp:9443/ → 内部サーバB ← ポート番号がユーザに見えるとなってしまうが、リバース プロキシなら
https://a.example.jp/ → 内部サーバA ← Host ヘッダーで判別 https://b.example.jp/ → 内部サーバBと、同じ 443 番ポートで振り分けられる。
なお、HTTPS の場合は暗号化されているため、
復号する前にHostヘッダーは読めない。
そこで **SNI(Server Name Indication)**が使われる
(TLS ハンドシェイクの ClientHello に平文でホスト名を載せる)。
リバース プロキシは SNI で証明書を選び、
復号してからHostヘッダーで振り分ける、という二段構えになる。Microsoft 系では
Application Request Routing (ARR)がこの役割を担う。
Azure ではAzureのGW / LB的なモノ。を参照。
以下の様に、単一のサーバ・マシンで複数の Web サイトを運用する場合の方法の一つとして使用できる。
- 既定は HTTP:80、HTTPS:443
- 既定値以外のポート番号を使用する場合、
クライアントは「http://www.example.jp:12345/index.html」のように
ポート番号を URL に加えなければならない。
NIC 増設は必須でないが、DHCP 運用は不可になる(静的 IP アドレス)。
複数の Web サイトで 1 つのリスニング・ポートを共有し、
ホストヘッダー(HTTP 1.1 準拠)を使用して振り分ける。
- Web サイトは、着信した Web 要求をホストヘッダー名に基づいて受け付ける。
- ポート番号を URL に加える必要がないので、ポート番号をユーザに意識させない。
- ホストヘッダー名をそのイントラネットの名前解決システム(DNS 等)に登録する。
補足(3 方式の比較): 本節が挙げる 3 つの方式を並べると
選択の基準がはっきりする。
方式 呼び名 長所 短所 ポート番号を変える ポート ベース 設定が最も簡単。DNS 不要 URL にポート番号が出る。ファイアウォールで各ポートを開ける必要 IP アドレスを増やす IP ベース HTTP/1.0 でも動く。SNI 非対応クライアントでも HTTPS が使える IP アドレスを消費。静的 IP が必要 ホストヘッダー 名前ベース 1 IP・1 ポートで無制限。URL が自然 DNS 登録が必要。HTTPS には SNI が必要 現在は名前ベースが標準であり、
IP ベースを選ぶ理由はほぼ無くなった
(SNI 非対応クライアントは事実上消滅しているため)。IIS での設定上の注意点を挙げておく。
注意 内容 バインドは「IP:ポート:ホスト名」の 3 つ組 3 つとも一致する必要がある 既定サイトの *:80:(ホスト名なし)すべてを受けるため、先に一致してしまうことがある HTTPS のホストヘッダー IIS 8 以降で SNI に対応(「サーバー名表示を要求する」にチェック) ワイルドカード *.example.jpの形で指定可能netsh http show sslcert証明書とポートの紐付けは HTTP.sys 側にある なお、名前解決の登録を忘れるのが最も多い失敗である。
ホストヘッダーで振り分ける以上、
クライアントがその名前でアクセスできなければ意味がない。
検証時はhostsファイルで代用できるが、
本番では DNS への登録が必須になる(DNSサーバ)。
- 1 つのサーバの 1 つの IP アドレスに Web サイトを追加する時、
Listening ポートが重複しないように変更してインストールする。
- @IT:Windows TIPS -- Tips:ネットワーク・カードに複数の IP アドレスを割り当てる
http://www.atmarkit.co.jp/fwin2k/win2ktips/608incipaddr/incipaddr.html - 複数の IP アドレスを使用して複数のサイトを作成する
https://msdn.microsoft.com/ja-jp/library/cc779368.aspx
- Web サイトのホスト ヘッダーを構成する (IIS 7)
https://technet.microsoft.com/ja-jp/library/cc753195.aspx - [HOW TO] ホスト ヘッダー名を使用して
1 つの IP アドレスに複数の Web サイトを設定する方法
https://support.microsoft.com/kb/308163/ja - Tech TIPS:Windows の IIS で単一 IP アドレスのサーバーに
複数の Web サイトを設置・運用する(ホストヘッダー編) - @IT
http://www.atmarkit.co.jp/ait/articles/0908/14/news045.html
Tags: 移行, Windows, IIS
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。