[86] [[HTTP/1.0]] と [[HTTP/1.1]] の [DFN[[CODE(HTTP)@en[[[Host:]]]]]] [[ヘッダー]]は、[[対象資源]]の[[ホスト]]と[[ポート]]を表します。
[[HTTP/2]] では [DFN[[CODE(HTTP)@en[[[:authority]]]]]] [[疑似ヘッダー]]となっています。

* 仕様書

[REFS[
- [85] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-5.4>'''
- [83] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-2.6>
- [404] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-5.7.2>
- [13] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=30>
- [18] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-8.1.2.3>
- [30] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-8.2>
]REFS]

* 意味

[89] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は、[[対象URL]]の[[ホスト]]と[[ポート]]を表します
[SRC[>>85]]。
[[HTTP/1.0]] と [[HTTP/1.1]] で使います。

[90] [[起源鯖]]は、同じ[[IPアドレス]]で複数の[[ホスト名]]の[[要求]]を処理している場合でも、
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]を使って区別できます [SRC[>>85]]。

[15] [[HTTP]] では、 [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は[[クライアント]]がアクセスしたい[[起源鯖]]の[[ホスト]]を表しています。

[14] [[SSDP]] では、 [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は [[SSDP]] 
で使用する[[マルチキャストアドレス]]と[[ポート]]となります [SRC[>>13]]。

[21] [CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]は、
[[対象URL]]の [[authority]] 部分を表します [SRC[>>18]]。
[[HTTP/2]] で使います。

* 構文

[91] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]の値は、
[[RFC 3986]] [CODE(ABNF)@en[[[host]]]]、または
[[RFC 3986]] [CODE(ABNF)@en[[[host]]]]、[CODE[[[:]]]]、
[[RFC 3986]] [CODE(ABNF)@en[[[port]]]] を並べたもの、とされています [SRC[>>85]]。

[FIG(railroad)[
- [CODE(ABNF)@en[[[ホスト名]]]]
- ?
-- [CODE(URI)[[[:]]]]
-- [CODE(ABNF)@en[[[ポート]]]]
]FIG]

;; [92] [[ホスト]]には、[[ドメイン名]]だけでなく、[[IPv4アドレス]]や
[[IPv6アドレス]]も指定できます。[[パーセント符号化]]も使えます。
空文字列にもできます。

;; [93] [[ポート]]は空文字列にもできます。[[先導0]]も使えます。

;; [95] [CODE(ABNF)@en[[[authority]]]] ではないので、
[CODE(ABNF)@en[[[userinfo]]]] は使えません。

[96] [[対象URL]]に [CODE(ABNF)@en[[[authority]]]] があれば、
そのうち [CODE(ABNF)@en[[[userinfo]]]] と [CODE(URI)[[[@]]]]
以外の部分と同じ値を [CODE(HTTP)@en[[[Host:]]]] で送らなければ[['''なりません''']] [SRC[>>85]]。

[97] [[対象URL]]に [CODE(ABNF)@en[[[authority]]]] がなければ、
[CODE(HTTP)@en[[[Host:]]]] は[[空文字列]]としなければ[['''なりません''']] [SRC[>>85]]。

;; [39] 理論上はそのような [[URL]] を[[対象URL]]にすることができますが (特に[[プロキシ]])、
実際上あり得るのかどうか不明です。

;; [10] [CODE(HTTP)@en[[[Via:]]]] や [CODE(HTTP)@en[[[Warning:]]]]
でも似た構文が使われていますが、細部が異なります。

;; [11] [CODE(HTTP)@en[[[Forwarded:]]]] [[ヘッダー]]の
[CODE(HTTP)@en[[[host]]]] [[引数]]では同じ構文が採用されています。

[12] [[RFC 6874]] は [[RFC 3986]] [CODE(ABNF)@en[[[host]]]] を拡張して [[IPv6]]
[[ゾーン識別子]]に対応させていますが、 [[RFC 6874]] も [[RFC 723x]]
も [[HTTP]] [CODE(HTTP)@en[[[Host:]]]] における取り扱いは規定していません。

[23] [CODE(HTTP)@en[[[:authority]]]] [[ヘッダー]]の値は、 [[URL]] の [[authority]]
です。ただし、 [CODE(ABNF)@en[[[userinfo]]]] は含んでは[['''なりません''']] [SRC[>>18]]。
つまり[[ホスト]]でなければなりません。

[FIG(railroad)[
= [[ホスト名]]
= ?
== [CODE[[[:]]]]
== [[ポート]]
]FIG]

[31] [[約束要求]]の [CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]の値は、
当該[[サーバー]]が [[authoritative]] である値でなければ[['''なりません''']] [SRC[>>30]]。

;; [[サーバープッシュ]]、[[HTTP接続]]も参照。

* 文脈

[84] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は [[HTTP/1.1]] 仕様書で規定されていますが、
すべての [[HTTP/1.x]] に対して定義されています [SRC[>>83]]。 [[HTTP/1.1]]
に適合するかに関わらず、すべての [[HTTP/1.x]] の実装は [CODE(HTTP)@en[[[Host:]]]]
[[ヘッダー]]を実装するべきです [SRC[>>83]]。

[402] 現在の[[鯖]]の状況を考えると、  [[HTTP/1.0]] [[要求メッセージ]]であっても、
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]を送らないと[[Web互換]]とは言えないと思われます。

[94] [[クライアント]]は、すべての [[HTTP/1.1]] [[要求メッセージ]]に
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]を含めなければ[['''なりません''']] [SRC[>>85]]。

;; [99] [[要求対象]]が [CODE(ABNF)@en[[[absolute-form]]]] であっても、
含めなければなりません。 [SRC[>>85]]

[98] [[クライアント]]は [CODE(HTTP)@en[[[Host:]]]] を最初の[[ヘッダー]]とする[['''べきです''']]
[SRC[>>85]]。

;; [19] この規定に[[クライアント]]が実際に従っているのかは謎です。
[[サーバー]]はどのみち[[ヘッダー]]をすべて読まないと処理できないので、
意味のある規定なのかも疑問です。

[22] [[HTTP/2]] では、 [CODE(HTTP)@en[[[:authority]]]] [[ヘッダー]]を使います。

[25] [[HTTP/2]] [[要求]]を直接[[生成]]する場合は、
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]のかわりに
[CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]を使う[['''べきです''']] [SRC[>>18]]。

;; [28] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]を[[生成]]することは完全には禁止されていないようですが、
実際の[[Webブラウザー]]は[[生成]]しないようです。 [TIME[2015-05-24T06:05:30.700Z]]

[24] [[HTTP/1.1]] [[要求]]で[[要求対象]]に [CODE(ABNF)@en[[[origin-form]]]] や
[CODE(ABNF)@en[[[asterisk-form]]]] が指定されていた場合には、
そこから [[HTTP/2]] [[要求]]を生成する場合、
[CODE(HTTP)@en[[[:authority]]]] [[ヘッダー]]は省略しなければ[['''なりません''']]
[SRC[>>18]]。

[26] [[HTTP/2]] [[要求]]を [[HTTP/1.1]] に変換する場合は、
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]が存在しなければ、
[CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]の値を複製して[[生成]]しなければ[['''なりません''']] [SRC[>>18]]。

;; [27] [[HTTP/1.1]] の >>405 の規定により、元から存在する場合も値を複製しなければならないと思われます。

;; [29] [[HTTP/2]] では [CODE(HTTP)@en[[[:authority]]]] と [CODE(HTTP)@en[[[Host:]]]]
のどちらかは含まれていなければならないものと思われますが、明確な規定はありません。

* 処理

[100] [[串]]は、[[要求対象]]が [CODE(ABNF)@en[[[absolute-form]]]]
のとき、 [CODE(HTTP)@en[[[Host:]]]] を無視しなければ[['''なりません''']]。
[SRC[>>85]]

;; [401] [[串]]以外も同様に [CODE(HTTP)@en[[[Host:]]]]
を無視するべきでしょうか? ([[実効要求URL]]の定義からすると、
[[鯖]]もそう解釈するべきでしょう。)

;; [403] [[クライアント]]が不正な操作を試みている可能性もあるので、
[[要求対象]]の [[authority]] と [CODE(HTTP)@en[[[Host:]]]]
が一致しない場合、[[起源鯖]]は [CODE(HTTP)[[[400]]]]
を返した方が良いかもしれません。

[405] [[串]]は、[[メッセージ]]を[[転送]]する際は、 [CODE(ABNF)@en[[[absolute-form]]]]
から新たに [CODE(HTTP)@en[[[Host:]]]] を[[生成]]しなければ[['''なりません''']]。
[SRC[>>85]]

;; [406] [[串]]は[[転送]]の際に [CODE(ABNF)@en[[[absolute-form]]]] の[[ホスト]]を書き換えることがあります
[SRC[>>404]]。 ([[要求対象]]の項を参照してください。)

[9] [[串]]は [CODE(HTTP)@en[[[Host:]]]] を書き換えた際に、元の値を
[CODE(HTTP)@en[[[Forwarded:]]]] [[ヘッダー]]の [CODE(HTTP)@en[[[host]]]]
[[引数]]に保存できます。

;; [CODE(HTTP)@en[[[Forwarded:]]]] や [CODE(HTTP)@en[[[host]]]] を参照。

[101] [[鯖]]は、 [[HTTP/1.1]] [[要求メッセージ]]に
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]が含まれていないか、
複数含まれているか、
[[欄値]]が[[非妥当]]であるなら、 [CODE(HTTP)[[[400]]]]
[[応答]]を返さなければ[['''なりません''']]。 [SRC[>>85]]

[16] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]の値は、
[[対象URL]]や[[基底文字列URL]]の計算に使われます。

;; [17] [[実効要求URL]]の[[ホスト]]の項も参照してください。

[32] [CODE(HTTP)@en[[[:authority]]]] [[疑似ヘッダー]]が[[応答]]や[[トレーラー部]]にあると、
[[奇形]]です。

[33] [[要求]]に [CODE(HTTP)@en[[[:authority]]]] も [CODE(HTTP)@en[[[Host:]]]]
も含まれない場合や [CODE(HTTP)@en[[[:authority]]]] が複数ある場合について
[[RFC]] には明記されていません。

[34] [CODE[[[:authority]]]] が複数あると [[Chrome]] は[[奇形]]としますが。
[[Firefox]] は[[奇形]]とはしないようです。 [TIME[2015-10-12T15:17:20.100Z]]

* IPv6 アドレス

[82] [[RFC 6874]] は[[IPv6アドレス]]に[[ゾーン識別子]]を添える構文を規定していますが、[[クライアント]]や[[プロキシ]]などは外に出す
[[URL]] から[[ゾーン識別子]]を削除しなければ[['''ならない''']]としています。 [CODE(HTTP)@en[[[Host:]]]]
は [[URL]] ではありませんが、これに準じるなら[[ゾーン識別子]]を含めるべきではなさそうです。

* 代替サービス

[36] [[代替サービス]]を使う場合でも、 [CODE(HTTP)@en[Host:]]
に指定する値は元の[[要求URL]]の[F[ホスト]]です。

;; [[代替サービス]]の[F[ホスト]]を示すための [CODE(HTTP)@en[Alt-Used:]] があります。

;; [[代替サービス]]も参照。

* セキュリティー

[38] [[実効要求URL]]参照。

* 歴史

[8] [CODE(HTTP)@en[[[Host:]]]] は [[RFC 1945]] 時代まではありませんでしたが、
[[バーチャルホスト]]の普及に伴い追加、実装されました。 [[RFC 2068]] による [[HTTP/1.1]]
以降は必須となっています。

[FIG(quote)[
[FIGCAPTION[
[87] RFC 2068・2616 (HTTP/1.1)14.23 Host
]FIGCAPTION]

> The Host request-header field specifies the Internet host and port
number of the resource being requested, as obtained from the original [DEL[URL]] [INS[URI]] given by the user or referring resource (generally an HTTP URL,
as described in section 3.2.2). The Host field value MUST represent
the [DEL[network location]] [INS[naming authority]] of the origin server or gateway given by the
original URL. This allows the origin server or gateway to
differentiate between internally-ambiguous URLs, such as the root "/"
URL of a server for multiple host names on a single IP address.

[CODE(HTTP)[Host]] 要求頭欄は、利用者又は参照している資源により与えられている元の
URI (通常は 3.2.2 節で説明している HTTP URL) から得た要求する資源のインターネット・ホスト及びポート番号を指定します。
[CODE(HTTP)[Host]] 欄値は、元の URL で与えられた起源サーバーまたは関門の 
naming authority を表現しなければ'''なりません'''。
これによって起源サーバー又は関門は内部的に曖昧な、単一の IP
アドレスの複数のホスト名を持つサーバーでの根 [CODE(URI)[/]] URL
のような URL を互いに区別することができます。

>
- Host = "Host" ":" host [ ":" port ]    ; Section 3.2.2

> A "host" without any trailing port information implies the default
port for the service requested (e.g., "80" for an HTTP URL). For
example, a request on the origin server for
<http://www.w3.org/pub/WWW/> [DEL[MUST]] [INS[would properly]] include:

[CODE(ABNF)[host]] に尾続のポート情報がないときは、
要求されたサービスの既定ポート (HTTP URL では [CODE[80]])
を暗示します。例えば、 <http://www.w3.org/pub/WWW/> の起源サーバーの要求は次のものを適切に含むこととなります。

>
[PRE[
GET /pub/WWW/ HTTP/1.1
Host: www.w3.org
]PRE]
> A client MUST include a Host header field in all HTTP/1.1 request
messages [DEL[on the Internet (i.e., on any message corresponding to a request for a URL which includes]] [INS[. If the requested URI does not include]]
an Internet host [DEL[address]] [INS[name]] for the
service being requested[DEL[)]][INS[, then the Host header field MUST be given with an empty value]]. [DEL[If the Host field is not already present, an]] [INS[An]]
HTTP/1.1 proxy MUST [DEL[add a Host field to the request message prior to forwarding it on the Internet.]] [INS[ensure that any request message it forwards does contain an appropriate Host header field that identifies the service being requested by the proxy.]] All Internet-based HTTP/1.1 servers
MUST respond with a 400 [INS[(Bad Request)]] status code to any HTTP/1.1 request message
which lacks a Host header field.

クライアントは、全ての HTTP/1.1 要求メッセージ中に [CODE(HTTP)[Host]]
頭欄を含めなければ'''なりません'''。要求される URI
が要求するサービスのインターネット・ホスト名を含んでいない場合は、
[CODE(HTTP)[Host]] 頭欄には空の値を与えなければ'''なりません'''。
HTTP/1.1 串は、その転送するメッセージがその串の要求するサービスを識別する適当な
[CODE(HTTP)[Host]] 頭欄を含むようにしなければ'''なりません'''。

> See sections 5.2 and [DEL[19.5.1]] [INS[19.6.1.1]] for other requirements relating to Host.
]FIG]

** 派生プロトコル

[7] [[HTTP]] から派生した [[RTSP]] は[[要求URL]]に [[HTTP]] と違って[[絶対URL]]
を使っているので、 [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]はありません [SRC[>>88]]。
また [[SIP]] も[[絶対URL]]を使い、 [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]はありません。

[FIG(quote)[
[FIGCAPTION[
[88] RFC 2326 (RTSP) 12.21 Host
]FIGCAPTION]

> This HTTP request header field is not needed for RTSP. It should be
silently ignored if sent.

[1] この HTTP 要求頭欄は RTSP には必要ではありません。
送られても黙って無視するのが良いです。
]FIG]

[81] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]]
( ([TIME[2013-07-20 22:21:48 +09:00]] 版))
<http://tools.ietf.org/html/rfc2660#section-2.6.3.2>

** IPv6

[20] [[RFC 2732]] は [[URL]] の [[authority]] を拡張し [[IPv6アドレス]]を指定できるように拡張するものでした。
しかし [[HTTP]] にどう影響するかは記載されていませんでした。

* 実装

[3] [[NN]] は、2 で既に
[CODE(HTTP)[Host]] 頭欄を送ってくれます。
(1 は未確認)

[4] [[WinIE]] は、3 未満は送ってくれません。

* 関連

[5] [[TLS]] にも同様の機能である [[SNI]] があります。 [CODE(HTTP)@en[[[Host:]]]]
に対して [[SNI]] の普及は遅れていましたが、10年代半ばになってようやく [[SNI]]
も広く実装されるに至りました。[[クライアント]]は、
どちらも指定しなければなりません。

* メモ

[2] この [[HTTP/1.1]] との温度差は、 [[RTSP]]/1.0
では[[要求行]]の [[URI]] が [[HTTP]] とは違って [CODE(ABNF)[scheme]]
から始まる完全な[[絶対URI]] であるためです。

[6]
[CITE@en-us[IP Version 6 Support]] ([TIME[2007-02-22 09:23:49 +09:00]] 版) <http://msdn2.microsoft.com/en-us/library/aa385325.aspx>
([[名無しさん]] [WEAK[2007-02-22 00:31:45 +00:00]])

[407] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]]
( ([TIME[2014-06-07 01:59:35 +09:00]] 版))
<https://tools.ietf.org/html/rfc7230#appendix-A.1.1>

[408] [CITE@en[RFC 3507 - Internet Content Adaptation Protocol (ICAP)]]
( ([TIME[2014-06-08 07:17:07 +09:00]] 版))
<http://tools.ietf.org/html/rfc3507#page-14>

[409] [CITE@en[RFC 2660 - The Secure HyperText Transfer Protocol]]
( ([TIME[2014-11-09 14:12:37 +09:00]] 版))
<http://tools.ietf.org/html/rfc2660#section-2.6.3.2>

[35] [CITE[Host:リクエストヘッダによるXSS - 葉っぱ日記]]
([TIME[2015-11-10 21:36:32 +09:00]] 版)
<http://d.hatena.ne.jp/hasegawayosuke/20151110/p1>

[FIG(quote)[
[FIGCAPTION[
[37] [CITE@en[RFC 3529 - Using Extensible Markup Language-Remote Procedure Calling (XML-RPC) in Blocks Extensible Exchange Protocol (BEEP)]]
([TIME[2016-02-07 17:22:13 +09:00]] 版)
<https://tools.ietf.org/html/rfc3529>
]FIGCAPTION]

>       <start number='1' serverName='stateserver.example.com'>
>           <profile uri='http://iana.org/beep/transient/xmlrpc' />
>       </start>
>    The "serverName" attribute is analogous to HTTP's "Host" request-
>    header field (c.f., Section 14.23 of '''['''3''']''').

]FIG]
