/
888.txt
328 lines (240 loc) · 17.1 KB
/
888.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
[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]]。
;; [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:]] があります。
;; [[代替サービス]]も参照。
* 歴史
[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>