[31] [[TCP/IP]] や [[UDP/IP]] の[[アドレス]]である、
[[ホスト]]と[[ポート]]の組を合わせた構文が用いられることがよくあります。
[[URL]] の [[authority]] でも、この構文が用いられることが多いです。

* 仕様書

[REFS[
- [4] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-03-14 22:44:13 +09:00]] 版) <https://html.spec.whatwg.org/#dom-location-host>
]REFS]

* 意味

[34] [[ホスト]]と[[ポート]]の[[組]]を表します。

[35] [[ポート]]は、省略可能です。[[ポート]]が省略された場合、
[[既定のポート]]を表すと理解されます。

* 構文

[32] [[ホスト]]は、必須です。

[33] [[ポート]]をも示すことができます。その場合、[[ホスト]]の後に [CODE[:]]
を書き、その後に[[ポート]]を書きます。

[FIG(railroad)[
= [[ホスト]]
= ?
== [CODE[[[:]]]]
== [[ポート]]
]FIG]

* 文脈

[FIG(middle list)[ [52] [[ホストとポート]]を使う場面
- 色々な [[URL scheme]] の [[authority]]
- [CODE[location.host]]
- [[HTTP/1]] [CODE(HTTP)@en[Host:]]
- [[HTTP/2]] [CODE(HTTP)@en[:authority]]
- [[HTTP]] [CODE(HTTP)@en[CONNECT]] の[[要求対象]]
- [[HTTP]] [CODE[Forwarded:]] [[ヘッダー]]の [CODE[host][X-Forwarded-Host]]
- [[HTTP]] [CODE[Warning:]] [[ヘッダー]]
- [[HTTP]] [CODE[Via:]] [[ヘッダー]]
]FIG]

;; [54] [[節点識別子]]は若干構成が異なります。

* URL authority

[415] [CODE(URI)@en[[[http:]]]] など多くの [[URL]] では、 
[F[authority]] に[[ホスト名]]を指定します。
直後に[[ポート番号]]、直前に [[userinfo]] を指定することも可能なことが多いです。

;; [37] [[userinfo]] を認めないもの、[[利用者名]]は認めても[[合言葉]]は認めないものもあります。
[[userinfo]] および [[authority]] も参照。

[38] [[URL scheme]] にもよりますが、一般に[[ホスト名]]が何を表しているのか正確には定義されていません。
ほとんどの場合、この[[ホスト名]]は[[インターネット]]の [[DNS]] によって[[名前解決]]して得られる
[[IPアドレス]]によって表現される[[ホスト]]を意味しています。しかし[[名前解決]]の方法や結果はシステムやアプリケーションに依存しており、
[[イントラネット]]内の独自の[[ドメイン名]]や、 [[DNS]] 以外の方法で[[解決]]される[[名前]]、
[[Tor]] の [CODE[[[.onion]]]] [[ドメイン名]]などが記述されることも少なくありません。

;; 詳しくは[[名前解決]]を参照。

[36] 通常は [[IPv4]] や [[IPv6]] の[[ユニキャストアドレス]]に[[解決]]されることが期待されていますが、
[[IP]] が使われるとは限りませんし、[[マルチキャスト]]等のアドレスとなることもあります。
[[CoAP]] のように[[マルチキャストアドレス]]への[[解決]]を特に想定したものもあります。

;; [42] [[ホストとポート]]を用いる具体的な [[URL scheme]] については、
[[authority]] を参照。

[55] [[ホスト名とポート]]を [[authority]] に使う [[URLの起源]]
(の[[直列化][起源のASCII直列化]]) として使われる場合もあります。

** 末尾の点

[43] [[ホスト]]としては、 [[FQDN]] の他、接尾辞を省略した形態や、
[[内部名]]の使用も特に禁止されていません。

[39] [[ホスト]]として、末尾に [[root domain]] を表す [CODE[.][末尾の点]] を付けた[[ドメイン名]]が用いられることも稀にあります。
しかし [[URL]] としての[[正規化]]の対象にはなっていませんから、 [CODE[.][末尾の点]]
が付かない[[ドメイン名]]とは異なるものとして扱われるのが普通です。

;; [[末尾の点]]、[[名前解決]]も参照。

[EG[
[40] 例えば [CODE[http://www.example.com/]] と [CODE[http://www.example.com./]]
の [[URLの起源]]は異なるとみなされますから、 [[JavaScript]] で両者のページに直接アクセスすることはできません。
]EG]

[41] しかし <http://to./> のように [[TLD]] にアクセスしたい時は[[内部名]]と誤認されることを防ぐため [CODE[[[.]]]]
を明示します。

** IP アドレス

[44] [[IPアドレス]]による指定は好ましくない [SRC[>>45]] とされることもあります。

[REFS[
- [45] [CITE@en[RFC 7472 - Internet Printing Protocol (IPP) over HTTPS Transport Binding and the 'ipps' URI Scheme]] ([TIME[2015-03-04 12:23:14 +09:00]] 版) <https://tools.ietf.org/html/rfc7472#section-4.2>
]REFS]

[46] [[予約済みIPアドレス]]の使用も特に禁止されていません。

-*-*-

[428] [[IPv6アドレス]]は [CODE[[['''[''']]]] と [CODE[[[''']''']]]] で括って指定することができます。
この区切りは、[[ホストとポート]]の区切りの [CODE[:]] と、
[[IPv6アドレス]]内部の [CODE[:]] の区別のために必要とされています。

;; [429] [[URL]] ではこれらの2文字は使えないことになっていましたが、 [[IPv6アドレス]]の表記のために(だけ)使えるように変更されました。

* Location インターフェイス host 属性 (DOM)

[3] [CODE(DOMi)@en[[[URLUtils]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[host]]]]]] [[IDL属性]]は、
[[ホスト]]と[[ポート]]を表します。

** 性質

[24] この[[属性]]は、 [CODE(xattr IDL)@en[Unforgeable]] です [SRC[>>4]]。

** 取得器

[5] [CODE(JS)@en[location.host]] の[[取得器]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>4]]。

[FIG(steps)[
= [8] [[文脈オブジェクト]]の[F[[[関係する[CODE(DOMi)@en[Document]]]]]]の[F[起源][文書の起源]]と[[入口設定群オブジェクト]]の[F[起源]]が[[同じ起源ドメイン]]でなければ、
== [9] [CODE(DOMe)@en[SecurityError]] [[例外]]を[[投げ]]、ここで停止します。
= [10] [VAR[URL]]を、[[文脈オブジェクト]]の[F[URL][Location (DOM)]] に設定します。
= [6] [VAR[URL]]の[F[ホスト]]が [[null]] なら、
== [7] [[空文字列]]を返してここで停止します。
= [14] [VAR[結果]]を、[VAR[URL]]の[F[ホスト]]に[[ホスト直列化器]]を適用した結果に設定します。
= [11] [VAR[URL]]の[F[ポート]]が [[null]] でなければ、
== [15] [VAR[結果]]の末尾に [CODE[:]] を追加します。
== [12] [VAR[結果]]の末尾に [VAR[URL]] の[F[ポート]]に[[整数の直列化]]を適用した結果を追加します。
= [13] [VAR[結果]]を返します。
]FIG]

** 設定器

[17] [CODE(JS)@en[location.host]] の[[設定器]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>4]]。

[FIG(steps)[
= [25] [VAR[入力]]を、与えられた値を [CODE(IDL)@en[USVString]] として解釈した結果に設定します。
= [18] [[文脈オブジェクト]]の[F[[[関係する[CODE(DOMi)@en[Document]]]]]]の[F[起源][文書の起源]]と[[入口設定群オブジェクト]]の[F[起源]]が[[同じ起源ドメイン]]でなければ、
== [19] [CODE(DOMe)@en[SecurityError]] [[例外]]を[[投げ]]、ここで停止します。
= [20] [VAR[複製]]を、[[文脈オブジェクト]]の[F[URL][Location (DOM)]] に設定します。
= [22] [VAR[複製]]の[F[cannot-be-a-base-URL flag]]が設定されていれば、ここで停止します。
= [21] [VAR[入力]]に[[基本URL構文解析]]を適用します。
[VAR[URL]] は[VAR[複製]]、[VAR[状態上書き]]は [[host state]] とします。
= [23] [[文脈オブジェクト]]と [VAR[複製]]について
[[[CODE(DOMi)@en[Location]]-object-setter navigate]] を実行します。
]FIG]

* 関連

[16] [[URL Standard]] の用語である[[ホスト]]は、[[ポート]]を含まない[[ホスト名]]部分を表します。
一方 [[DOM API]] の [CODE(DOMa)@en[host][location.host]] は、
[[ホスト]]と[[ポート]]の両方を表します。

[2] [CODE(DOMa)@en[[[hostname]]]] [[IDL属性]]は[[ホスト]]のみを表します。

[30] [CODE[Alt-Svc:]] [[ヘッダー][HTTPヘッダー]]は、本項の[[ホスト]]と[[ポート]]の構文とは逆に、
[[ホスト]]が省略可能で[[ポート]]が必須の構文を採用しています。

* 歴史

[48] [[authority]] も参照。

** ゾーン識別子

[430] [[IPv6 Scoped Address]] は [[IPv6アドレス]]の後に [CODE[[[%]]]] で区切って[[ゾーン識別子]]を指定したもので、
解釈する環境における[[ネットワークインターフェイス]]とそれを使ってアクセスするべき [[IPv6アドレス]]を表したものとなっています。
[[RFC 6874]] はこれを [[authority]] として使う方法を定義しています。

[REFS[
- [431] [CITE@en[RFC 6874 - Representing IPv6 Zone Identifiers in Address Literals and Uniform Resource Identifiers]] ([TIME[2013-06-28 00:01:53 +09:00]] 版) <http://tools.ietf.org/html/rfc6874>
]REFS]

[433] 区切り文字の [CODE[[[%]]]] は、[[パーセント符号化]]して [CODE[[[%25]]]] とします [SRC[>>431]]。

[432] [[ゾーン識別子]]は、[[非予約文字]]はそのままでも構いませんが、それ以外は[[パーセント符号化]]します [SRC[>>431]]。
このとき使う[[文字コード]]は特に規定されていないようです。

;; [434] [[ゾーン識別子]]は[[非予約文字]]だけを使う[['''べきです''']]とされています [SRC[>>431]] が、
それは[[ゾーン識別子]]の仕様で規定するべきことで、 [[URL]] の [[RFC]] で要求するべきことではないでしょう...

;; [435] [[IPv4アドレス]]を使った [[URL]] でこの[[ゾーン識別子]]構文に相当するものはありません。

[436] この [[RFC]] が発行される前からこの構文を実装していた[[Webブラウザー]]もあり、また[[パーセント符号化]]されていない
[CODE[[[%]]]] を区切りにしている [[Webブラウザー]]もありました [SRC[>>431]]。 (特別に解釈しないでそのまま
[[OS]] に渡していただけかもしれませんが...) ただし生の [CODE[[[%]]]] を使った場合、その直後2文字が16進数として解釈できる場合、
2種類の解釈が可能となってしまいます。 [[Webブラウザー]]で[[利用者]]に [[URL]] を入力させる場合にあっては、
16進数として解釈できない場合は [CODE[[[%]]]] だけでも [CODE[[[%25]]]] の意味に扱うのがよかろうとされています [SRC[>>431]]。

[437] [[ゾーン識別子]]は特定の[[ホスト]]でしか意味をなしませんし、むしろ[[セキュリティー]]上の懸念もあります。
ですから明確な用途がある場合を除き、認めては[['''なりません''']]。例えば [[link-local address]] ([CODE[[[fe80::/10]]]]) 
がありますが、この [[RFC]] の執筆の時点で認められるべきなのはこれだけです。 [SRC[>>431]]

;; [438] 認められない時にどうするべきなのかは述べられていません。エラーとするべきなのか、
[[ゾーン識別子]]を削って続行するべきなのか。

[439] [[HTTP]] [[クライアント]]、[[プロキシ]]その他中間のものは外に出す [[URL]]
から[[ゾーン識別子]]を削除しなければ[['''なりません''']] [SRC[>>431]]。

;; [440] [[URL]] ではありませんが、 [CODE(HTTP)@en[[[Host:]]]] ヘッダーにも[[ゾーン識別子]]は含めるべきではなさそうです。
([CODE(HTTP)@en[[[Host:]]]] ([[RFC 723x]]) は [[URL]] ([[RFC 3986]]) の 
[CODE(ABNF)@en[[[host]]]] を参照しています。)

[441] [[URL Standard]] にはこの構文は含まれていません。

[EG[
[442] 
[PRE(URI example code)[
http://[fe80::a%25en1]
]PRE]
... [SRC[>>431]] は [CODE[fe80::a]] に[[ゾーン識別子]] [CODE[en1]] を使ってアクセスすることを表しています。
]EG]


[FIG(quote)[
[FIGCAPTION[
[53] [CITE[cURL - How To Use]]
( ([TIME[2016-05-31 06:05:05 +09:00]]))
<https://curl.haxx.se/docs/manpage.html>
]FIGCAPTION]

> Provide the IPv6 zone index in the URL with an escaped percentage sign and the interface name. Like in
>   http://'''['''fe80::3%25eth0''']'''/

]FIG]


** [CODE[IPvFuture]]

[443] [[RFC 3986]] は将来の拡張用として、 [DFN[[CODE[[[IPvFuture]]]]]] 構文を定義しています。
[[IPv6アドレス]]のように [CODE[[['''[''']]]] と [CODE[[[''']''']]]] で括りますが、先頭に
[CODE[v1.]] のような版識別子がつきます。

[444] 現時点でこの構文は使われていません。また [[IANA登録簿]]もなさそうです。

[445] [CITE[URL Standard]] にはこの構文はありません。

[449] [[draft-fenner-literal-zone]] は[[ゾーン識別子]]のために
[PRE(URI example code)[
http://[v6.fe80::a+en1]
http://[v1.fe80::a_en1]
]PRE]
... のような構文を提案していましたが、十分な支持を得られなかったようで、数年のブランクの後 >>431
の通り [[IPv6アドレス]]の構文を拡張する形になっています。

[REFS[
- [446] [CITE@en[draft-fenner-literal-zone-00 - Formats for IPv6 Scope Zone Identifiers in Literal Address Formats]] (2004) 
<http://tools.ietf.org/html/draft-fenner-literal-zone-00>
- [447] [CITE@en[draft-fenner-literal-zone-01 - Formats for IPv6 Scope Zone Identifiers in Literal Address Formats]] (2005) <http://tools.ietf.org/html/draft-fenner-literal-zone-01>
- [448] [CITE@en[draft-fenner-literal-zone-02 - Formats for IPv6 Scope Zone Identifiers in Literal Address Formats]] (2005)
<http://tools.ietf.org/html/draft-fenner-literal-zone-02>
]REFS]

** IP アドレスを表す非標準の authority

[47] <http://[208.77.188.166]/>

[[Firefox]] は [[IPv4]] [[番地]] 208.77.188.166
の[[鯖]]に接続します。 [CODE(HTTP)@en[[[Host]]:]] には 208.77.188.166
という値が使われます。

[[Opera]] は [[IPv4]] [[番地]] 208.77.188.166
の[[鯖]]に接続します。 [CODE(HTTP)@en[[[Host]]:]] にはおそらく [208.77.188.166]
という値が使われるので、 [[Apache]] からは [CODE(HTTP)[[[400]]]]
が返ってきます。

[[Safari]] は[[鯖]]を探し続けます。


[[WinIE 7]] ではエラーが表示されます。

[407] <http://[www.google.com]/>

;; いずれも [[Windows Vista]] での結果です。

[427] [[Windows 7]] 上の [[Chrome]] では、 >>47 も >>407 もリンク先が [CODE(URI)@en[[[about:blank]]]] になりました。
[[解決]]できない [[URL]] として扱われているのでしょうか。 [TIME[2013-10-14T13:03:57.500Z]]

**

[REFS[
- [1] [CITE@en[URL Standard]] ([TIME[2015-09-18 15:38:29 +09:00]] 版) <https://url.spec.whatwg.org/#dom-urlutils-host>
]REFS]

[26] [CITE@en[Editorial: non-relative flag got renamed · whatwg/html@d360c27]]
([TIME[2016-03-31 12:41:04 +09:00]] 版)
<https://github.com/whatwg/html/commit/d360c27d44c52390441b5910d39e898160ec016d>

[27] [CITE@en[Merge effective script origin into origin · whatwg/html@8a843f2]]
([TIME[2016-03-31 18:06:30 +09:00]] 版)
<https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>

[28] [CITE@en[Clarify that proxy hosts are domains and ports.]]
([[shs96c]]著, [TIME[2017-05-04 20:07:24 +09:00]])
<https://github.com/w3c/webdriver/commit/29c5a9a953a8d388589ce7ee50e8c24f4c6e6c4f>

[29] [CITE@en[Better define proxies]]
([[shs96c]]著, [TIME[2017-06-26 20:03:01 +09:00]])
<https://github.com/w3c/webdriver/commit/a90db4b119de8c77875647e30b611c1c49a4349b>


[FIG(quote)[
[FIGCAPTION[
[49] [CITE@en[27234 – Support IPv6 link-local addresses?]]
([TIME[2015-08-15 11:26:22 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27234#c2>
]FIGCAPTION]

> Yes, we're especially not keen to support these in Chrome and have repeatedly decided not to. 

]FIG]

[50] [CITE@en[Note that there are no plans to support <zone_id>. Fixes https://www.… · whatwg/url@ca97ec8]]
([TIME[2015-08-15 11:46:17 +09:00]] 版)
<https://github.com/whatwg/url/commit/ca97ec836d3ff246d5c53f420b0eb2798f2a982c>

[51] [CITE@en[Indicate that host is not always used as network address. Fixes https… · whatwg/url@4c0f091]]
([TIME[2015-08-15 11:47:33 +09:00]] 版)
<https://github.com/whatwg/url/commit/4c0f0916e640a3b031302c0a11cfad50c3f8a2b6>

[59] [CITE@en[945240 - Consider making Location.href punycode non-ASCII hostnames]]
([TIME[2017-05-14 15:36:42 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=945240>

[61] [CITE@en[700999 - Firefox does not appear to support IPv6 link-local addresses]]
([TIME[2017-05-26 21:58:31 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=700999>

[62] [CITE@en[draft-sweet-uri-zoneid-01 - An IPvFuture Syntax for IPv6 Link-Local Addresses]]
([TIME[2017-05-22 04:07:22 +09:00]])
<https://tools.ietf.org/html/draft-sweet-uri-zoneid-01>