URL

現行標準 — 最終更新

参加方法:
GitHub whatwg/url (新しい課題, 未解決の課題)
Matrixでチャット
コミット:
GitHub whatwg/url/commits
このコミット時点のスナップショット
@urlstandard
テスト:
web-platform-tests url/ (進行中の作業)
翻訳 (参考情報):
日本語
简体中文
한국어

概要

URL標準は、URL、ドメイン、IPアドレス、application/x-www-form-urlencoded形式、およびそれらのAPIを定義します。

目標

URL標準は、URLの完全な相互運用性を実現するため、以下のアプローチを取ります:

編集者が本件について知識を深めるにつれ、目標の範囲が広がる可能性があります。

1. 基盤

本仕様はInfraに依存します。[INFRA]

本仕様で使われるいくつかの用語は、以下の標準・仕様書で定義されています:


整数を直列化するには、可能な限り短い10進数で表現します。

1.1. 記述

バリデーションエラーは、入力が有効な入力と一致しないことを示します。ユーザーエージェント、特に適合性チェッカーは、これをどこかに報告することが推奨されます。

バリデーションエラーが発生しても、パーサーが終了するわけではありません。パーサーの終了は、常に明示的に(例えばreturn文によって)記述されます。

バリデーションエラーを通知することは有用です。なぜなら、エラー処理は直感的でない場合があり、古いユーザーエージェントが正しいエラー処理を実装していないこともあり、記述の意図が他の開発者にとって不明瞭である可能性があるためです。

エラー種別 エラー説明 失敗
IDNA
domain-to-ASCII

Unicode ToASCIIがエラーを記録するか空文字列を返します。 [UTS46]

もしUnicode ToASCIIのエラー詳細が記録されている場合は、ユーザーエージェントはそれを伝達することが推奨されます。

はい
domain-invalid-code-point

入力のホスト禁止ドメインコードポイントが含まれています。

URLが特別な場合、ホストはパーセントデコードされてから処理されるため、下記のホスト部分は「exa#mple.org」となり、このエラーが発生します。

"https://exa%23mple.org"

はい
domain-to-Unicode

Unicode ToUnicodeがエラーを記録します。[UTS46]

domain-to-ASCIIの場合と同様の考慮事項が適用されます。

·
ホスト解析
host-invalid-code-point

不透明ホスト特別ではないURLの場合)に禁止ホストコードポイントが含まれています。

"foo://exa[mple.org"

はい
IPv4-empty-part

IPv4アドレスがU+002E(.)で終わっています。

"https://127.0.0.1./"

·
IPv4-too-many-parts

IPv4アドレスが4つの部分で構成されていません。

"https://1.2.3.4.5/"

はい
IPv4-non-numeric-part

IPv4アドレスの一部が数値ではありません。

"https://test.42"

はい
IPv4-non-decimal-part

IPv4アドレスに、16進数または8進数で表現された数字が含まれています。

"https://127.0.0x0.1"

·
IPv4-out-of-range-part

IPv4アドレスの一部が255を超えています。

"https://255.255.4000.1"

はい
(最後の部分に該当する場合のみ)
IPv6-unclosed

IPv6アドレスの終端にU+005D(])がありません。

"https://[::1"

はい
IPv6-invalid-compression

IPv6アドレスの圧縮開始が不正です。

"https://[:1]"

はい
IPv6-too-many-pieces

IPv6アドレスの部分が8つを超えています。

"https://[1:2:3:4:5:6:7:8:9]"

はい
IPv6-multiple-compression

IPv6アドレスが2箇所以上で圧縮されています。

"https://[1::1::1]"

はい
IPv6-invalid-code-point

IPv6アドレスに、ASCII 16進数字でもU+003A(:)でもないコードポイントが含まれているか、予期せぬ終了があります。

"https://[1:2:3!:4]"

"https://[1:2:3:]"

はい
IPv6-too-few-pieces

圧縮されていないIPv6アドレスの部分が8つ未満です。

"https://[1:2:3]"

はい
IPv4-in-IPv6-too-many-pieces

IPv6アドレスIPv4アドレス構文を使っていて、IPv6部分が6つを超えています。

"https://[1:1:1:1:1:1:1:127.0.0.1]"

はい
IPv4-in-IPv6-invalid-code-point

IPv6アドレスIPv4アドレス構文を使っていて、

  • IPv4部分が空、またはASCII数字以外を含む。
  • IPv4部分に先頭0が含まれる。
  • IPv4部分が多すぎる。

"https://[ffff::.0.0.1]"

"https://[ffff::127.0.xyz.1]"

"https://[ffff::127.0xyz]"

"https://[ffff::127.00.0.1]"

"https://[ffff::127.0.0.1.2]"

はい
IPv4-in-IPv6-out-of-range-part

IPv6アドレスIPv4アドレス構文を使っていて、IPv4部分が255を超えています。

"https://[ffff::127.0.0.4000]"

はい
IPv4-in-IPv6-too-few-parts

IPv6アドレスIPv4アドレス構文を使っていて、IPv4アドレス部分が少なすぎます。

"https://[ffff::127.0.0]"

はい
URL解析
invalid-URL-unit

URL単位でないコードポイントが見つかりました。

"https://example.org/>"

" https://example.org "

"ht
tps://example.org
"

"https://example.org/%s"

·
special-scheme-missing-following-solidus

入力のスキームの後に「//」がありません。

"file:c:/my-secret-folder"

"https:example.org"

const url = new URL("https:foo.html", "https://example.org/");
·
missing-scheme-non-relative-URL

入力にスキームがありません。ASCII英字で始まっておらず、基本URLが与えられていないか、基本URL不透明パスを持つため、基本URLとして利用できません。

入力のスキームがなく、基本URLもありません:

const url = new URL("💩");

入力のスキームがなく、基本URL不透明パスを持っています:

const url = new URL("💩", "mailto:user@example.org");
はい
invalid-reverse-solidus

URLが特別なスキームを持ち、U+005C(\)をU+002F(/)の代わりに使っています。

"https://example.org\path\to\file"

·
invalid-credentials

入力が認証情報を含みます。

"https://user@example.org"

"ssh://user@example.org"

·
host-missing

入力が特別なスキームを持つが、ホストが存在しません。

"https://#fragment"

"https://:443"

"https://user:pass@"

はい
port-out-of-range

入力のポートが大きすぎます。

"https://example.org:70000"

はい
port-invalid

入力のポートが無効です。

"https://example.org:7z"

はい
file-invalid-Windows-drive-letter

入力が相対URL文字列で、Windowsドライブレターで始まり基本URLスキームが「file」です。

const url = new URL("/c:/path/to/file", "file:///c:/");
·
file-invalid-Windows-drive-letter-host

file: URLのホストがWindowsドライブレターです。

"file://c:"

·

1.2. パーサー

EOFコードポイントは、文字列やコードポイント列の終端を示す概念的なコードポイントです。

文字列 inputポインターは、input内のコードポイントを指す整数です。初期値はinputの先頭を指します。−1の場合はどこも指していません。inputコードポイント長以上の場合、EOFコードポイントを指します。

ポインターが使われるとき、cコードポイントのうち、ポインターが指すものを参照します(どこも指していない場合を除く)。ポインターがどこも指していない場合、cは使用できません。

ポインターが使われるとき、remainingは、コードポイント部分文字列ポインター+1から末尾まで)を参照します。ただし、cEOFコードポイントでない場合のみです。 cEOFコードポイントの場合、remainingは使用できません。

mailto:username@example」が処理中の文字列で、ポインターが@を指している場合、cはU+0040(@)、remainingは「example」です。

空文字列を処理していて、ポインターが先頭を指し、その後1減らされた場合、cremainingを使用するのはエラーです。

1.3. パーセントエンコードされたバイト

パーセントエンコードされたバイトは、U+0025 (%) の後に2つのASCII16進数字が続くものです。

パーセントエンコードされたバイト列をパーセントデコードし、BOMなしのUTF-8デコード(failあり)に渡したとき、失敗しないようなものにするのが一般的に良い考えです。どこで使われるかによって重要度は異なります。例えば、ホストパーサーの場合、この注意に従わないと致命的ですが、URL表示の場合、パーセントエンコードされたバイトパーセントデコードされません。

byte byteパーセントエンコードするには、U+0025 (%) の後にbyteを表す2つのASCII大文字16進数字を付けた文字列を返します。

バイト列inputパーセントデコードするには、以下の手順を実行します:

inputASCIIバイト以外のバイトが含まれている場合、BOMなしUTF-8デコード以外を使うのはセキュリティ的に推奨されません。

  1. outputを空のバイト列とする。

  2. inputの各バイトbyteについて:

    1. byteが0x25(%)でなければ、byteoutputに追加する。

    2. そうでなく、byteが0x25(%)かつinputの次の2バイトが0x30(0)~0x39(9)、0x41(A)~0x46(F)、0x61(a)~0x66(f)のいずれにも該当しない場合、byteoutputに追加する。

    3. それ以外の場合:

      1. bytePointinputbyteの次の2バイトを等価デコードし、16進数として解釈した値とする。

      2. bytePointの値のバイトをoutputに追加する。

      3. inputの次の2バイトをスキップする。

  3. outputを返す。

スカラー値文字列 inputパーセントデコードするには:

  1. inputUTF-8エンコーディングbytesとする。

  2. bytesパーセントデコードした結果を返す。

一般に、パーセントエンコードの結果は入力よりU+0025(%)が多い文字列となり、パーセントデコードの結果は入力より0x25(%)が少ないバイト列となります。


C0コントロールパーセントエンコードセットは、C0コントロールおよびU+007E(~)より大きい全てのコードポイントです。

fragmentパーセントエンコードセットは、C0コントロールパーセントエンコードセット及び U+0020(スペース)、U+0022(")、U+003C(<)、U+003E(>)、U+0060(`)です。

queryパーセントエンコードセットは、C0コントロールパーセントエンコードセット及び U+0020(スペース)、U+0022(")、U+0023(#)、U+003C(<)、U+003E(>)です。

queryパーセントエンコードセットは、U+0060(`)が省かれているため、fragmentパーセントエンコードセットの定義を流用できません。

special-queryパーセントエンコードセットは、queryパーセントエンコードセット及び U+0027(')です。

pathパーセントエンコードセットは、queryパーセントエンコードセット及びU+003F(?)、U+005E(^)、U+0060(`)、U+007B({)、U+007D(})です。

userinfoパーセントエンコードセットは、pathパーセントエンコードセット及びU+002F(/)、U+003A(:)、U+003B(;)、U+003D(=)、U+0040(@)、U+005B([)からU+005D(])(両端含む)、U+007C(|)です。

componentパーセントエンコードセットは、userinfoパーセントエンコードセット及び U+0024($)からU+0026(&)(両端含む)、U+002B(+)、U+002C(,)です。

これはHTMLregisterProtocolHandler()で使われており、他の標準でも URLpathqueryfragment、またはopaque hostに埋め込むデータのパーセントエンコードにも利用できます。UTF-8パーセントエンコードと組み合わせると、JavaScriptのencodeURIComponent() [sic]と同じ結果になります。[HTML] [ECMA-262]

application/x-www-form-urlencoded パーセントエンコードセットは、componentパーセントエンコードセット及びU+0021(!)、U+0027(')からU+0029(右括弧)(両端含む)、U+007E(~)です。

application/x-www-form-urlencoded パーセントエンコードセットは、 ASCII英数字、U+002A(*)、U+002D(-)、U+002E(.)、U+005F(_)以外の全てのコードポイントを含みます。

encoding encodingスカラー値文字列 inputpercentEncodeSet、省略可能な真偽値spaceAsPlus(デフォルトfalse)を与えて、エンコード後パーセントエンコードするには:

  1. encoderencodingからエンコーダーを取得した結果とする。

  2. inputQueueinputI/Oキューに変換したものとする。

  3. outputを空文字列とする。

  4. potentialErrorを0とする。

    これは次のwhileループを開始するために非null値が必要です。

  5. potentialErrorが非nullの間:

    1. encodeOutputを空のI/Oキューとする。

    2. potentialErrorエンコードまたは失敗inputQueueencoderencodeOutputで実行した結果をセットする。

    3. encodeOutputをバイト列に変換した各byteについて:

      1. spaceAsPlusがtrueでbyteが0x20(SP)なら、U+002B(+)をoutputに追加し、continueする。

      2. isomorphbyteを持つコードポイントとする。

      3. アサート:percentEncodeSetは全ての非ASCIIコードポイントを含む。

      4. isomorphpercentEncodeSetに含まれていなければ、そのままoutputに追加する。

      5. それ以外の場合はbyteパーセントエンコードし、結果をoutputに追加する。

    4. potentialErrorが非nullなら、"%26%23"とpotentialErrorの10進ASCII数字による最短列、さらに"%3B"をoutputに追加する。

      encodingUTF-8でない場合に起こり得ます。

  6. outputを返す。

percentEncodeSet引数の値のうち、U+0025(%)をエンコードして「ラウンドトリップ可能なデータ」を与えるのは、コンポーネントパーセントエンコードセットapplication/x-www-form-urlencodedパーセントエンコードセットだけです。他の値(URLパーサーが使うもの)はU+0025(%)をそのまま残すため、正しく表現するにはまずパーセントエンコードする必要があります。

スカラー値 scalarValuepercentEncodeSetUTF-8パーセントエンコードするには、エンコード後パーセントエンコードUTF-8scalarValue文字列として)、percentEncodeSetで実行した結果を返します。

スカラー値文字列 inputpercentEncodeSetUTF-8パーセントエンコードするには、エンコード後パーセントエンコードUTF-8inputpercentEncodeSetで実行した結果を返します。


上記の操作の例によるまとめ:

操作 入力 出力
パーセントエンコード input 0x23 "%23"
0x7F "%7F"
パーセントデコード input `%25%s%1G` `%%s%1G`
パーセントデコード input "‽%25%2E" 0xE2 0x80 0xBD 0x25 0x2E
エンコード後パーセントエンコードShift_JISinputユーザー情報パーセントエンコードセット" " "%20"
"" "%81%DF"
"" "%26%238253%3B"
エンコード後パーセントエンコードISO-2022-JPinputユーザー情報パーセントエンコードセット"¥" "%1B(J\%1B(B"
エンコード後パーセントエンコードShift_JISinputユーザー情報パーセントエンコードセット、true) "1+1 ≡ 2%20‽" "1+1+%81%DF+2%20%26%238253%3B"
UTF-8パーセントエンコード inputユーザー情報パーセントエンコードセット使用) U+2261 (≡) "%E2%89%A1"
U+203D (‽) "%E2%80%BD"
UTF-8パーセントエンコード inputユーザー情報パーセントエンコードセット使用) "Say what‽" "Say%20what%E2%80%BD"

2. セキュリティの考慮事項

URLのセキュリティは、その環境によって左右されます。URLの表示、解釈、受け渡し時には注意が必要です。

URLの表示や新規割り当ての際には「なりすまし」に注意する必要があります。すなわち、あるホストURLが別のものと誤認される攻撃です。たとえば、1/l/I、m/rn/rri、0/O、а/aが酷似して見える場合や、U+202A LEFT-TO-RIGHT EMBEDDINGなど不可視コードポイントが使われる場合などです。 [UTR36]

あるURLを当事者AからBに渡すとき、両者は何が起こるか慎重に検討する必要があります。Aは意図しないデータを漏洩してしまうかもしれず、Bは予期しない入力を受けて利用者に害を及ぼす行動を取る可能性があります。特に、BAを決して信用してはなりません。なぜなら、AからのURLが信頼できないソース由来となることがあるためです。

3. ホスト(ドメインおよびIPアドレス)

概略として、ホスト有効なホスト文字列ホストパーサーホストシリアライザーの関係は以下の通りです:

パースシリアライズのラウンドトリップの結果は、ホストパーサーisOpaque引数に応じて次のようになります:

入力 出力 (isOpaque = false) 出力 (isOpaque = true)
EXAMPLE.COM example.com (ドメイン) EXAMPLE.COM (不透明ホスト)
example%2Ecom example%2Ecom (不透明ホスト)
faß.example xn--fa-hia.example (ドメイン) fa%C3%9F.example (不透明ホスト)
0 0.0.0.0 (IPv4) 0 (不透明ホスト)
%30 %30 (不透明ホスト)
0x 0x (不透明ホスト)
0xffffffff 255.255.255.255 (IPv4) 0xffffffff (不透明ホスト)
[0:0::1] [::1] (IPv6)
[0:0::1%5D 失敗
[0:0::%31]
09 失敗 09 (不透明ホスト)
example.255 example.255 (不透明ホスト)
example^example 失敗

3.1. ホストの表現

ホストは、ドメインIPアドレス不透明ホスト、または空ホストです。通常、ホストはネットワークアドレスとして機能しますが、ネットワークアドレスが不要なURLにおいて不透明識別子として使われることもあります。

典型的なURLで、ホスト不透明ホストなのは git://github.com/whatwg/url.gitです。

以下で参照されるRFCは参考情報であり、ホストの記述・解析・直列化に影響しません(後続のセクションで特に記載がない限り)。

ドメインは、ネットワーク内の領域を識別する非空のASCII文字列です。[RFC1034]

ドメイン domainドメインラベルは、domainをU+002E(.)で厳密分割した結果です。

example.comexample.com.というドメインは等価ではなく、通常区別されます。

IPアドレスIPv4アドレスまたはIPv6アドレスです。

IPv4アドレス32ビット符号なし整数でネットワークアドレスを識別します。[RFC791]

IPv6アドレス128ビット符号なし整数でネットワークアドレスを識別します。この整数は、8つの16ビット符号なし整数からなるリストで構成され、IPv6アドレスピースとも呼ばれます。[RFC4291]

<zone_id>のサポートは意図的に除外されています

不透明ホストは、さらなる処理に使用できる非空のASCII文字列です。

空ホストは空文字列です。

3.2. ホストその他

禁止ホストコードポイントは、U+0000(NULL)、U+0009(TAB)、U+000A(LF)、U+000D(CR)、U+0020(スペース)、U+0023(#)、U+002F(/)、U+003A(:)、U+003C(<)、U+003E(>)、U+003F(?)、U+0040(@)、U+005B([)、U+005C(\)、U+005D(])、U+005E(^)、U+007C(|)です。

禁止ドメインコードポイントは、禁止ホストコードポイントC0コントロール、U+0025(%)、U+007F(DELETE)です。

ホスト hostパブリックサフィックスを取得するには、以下の手順を実行します。これはnullまたはPublic Suffix Listに含まれるhostの一部を表すドメインを返します。[PSL]

  1. hostドメインでなければ、nullを返す。

  2. hostが「.」で終わるならtrailingDotを「.」、そうでなければ空文字列とする。

  3. publicSuffixPublic Suffix Listアルゴリズムhostをドメインとして実行した結果とする。[PSL]

  4. アサート:publicSuffixは「.」で終わらないASCII文字列。

  5. publicSuffixtrailingDotを連結して返す。

ホスト host登録可能ドメインを取得するには、以下の手順を実行します。これはnullまたはhostパブリックサフィックスとその直前のドメインラベルから構成されるドメインを返します。

  1. hostパブリックサフィックスがnull、またはhostパブリックサフィックスhost等価なら、nullを返す。

  2. hostが「.」で終わるならtrailingDotを「.」、そうでなければ空文字列とする。

  3. registrableDomainPublic Suffix Listアルゴリズムhostをドメインとして実行した結果とする。[PSL]

  4. アサート:registrableDomainは「.」で終わらないASCII文字列。

  5. registrableDomaintrailingDotを連結して返す。

ホスト入力 パブリックサフィックス 登録可能ドメイン
com com null
example.com com example.com
www.example.com com example.com
sub.www.example.com com example.com
EXAMPLE.COM com example.com
example.com. com. example.com.
github.io github.io null
whatwg.github.io github.io whatwg.github.io
إختبار xn--kgbechtv null
example.إختبار xn--kgbechtv example.xn--kgbechtv
sub.example.إختبار xn--kgbechtv example.xn--kgbechtv
[2001:0db8:85a3:0000:0000:8a2e:0370:7334] null null

仕様はセキュリティ判断のためオリジン概念を優先すべきです。「パブリックサフィックス」や「登録可能ドメイン」は堅固なセキュリティ境界を提供できません。パブリックサフィックスリストはクライアントごとに異なります。これを無視する仕様は、URLのスキームを判断に組み込むべきか慎重に検討してください。例えばsame siteschemelessly same site概念を使うかどうかなどです。

3.3. IDNA

domain to ASCIIアルゴリズムは、文字列 domainと真偽値beStrictを受け取り、以下の手順を実行します:

  1. resultを、domain_namedomainCheckHyphensbeStrictCheckBidiにtrue、CheckJoinersにtrue、UseSTD3ASCIIRulesbeStrictTransitional_Processingにfalse、VerifyDnsLengthbeStrictIgnoreInvalidPunycodeにfalseをセットしてUnicode ToASCIIを実行した結果とする。[UTS46]

    beStrictがfalseで、domainASCII文字列かつ、domainをU+002E(.)で厳密分割して得られる各要素が、ASCII大文字小文字区別せずに"xn--"で始まらない場合、このステップはdomainASCII小文字化と同等です。

  2. resultが失敗値なら、domain-to-ASCII バリデーションエラーとして失敗を返す。

  3. beStrictがfalseの場合:

    1. resultが空文字列なら、domain-to-ASCII バリデーションエラーとして失敗を返す。

    2. result禁止ドメインコードポイントが含まれていれば、domain-invalid-code-point バリデーションエラーとして失敗を返す。

      Web互換性やDNS以外のシステムとの互換性のため、禁止ドメインコードポイントUseSTD3ASCIIRulesがtrueの場合の不許可セットの部分集合です。issue #397も参照。

  4. アサートresultは空文字列ではなく、禁止ドメインコードポイントを含まない。

    Unicode IDNA Compatibility ProcessingbeStrictがtrueの場合、これを保証します。[UTS46]

  5. resultを返す。

この文書とWebプラットフォーム全体ではUnicode IDNA Compatibility Processingを使用しており、IDNA2008は使用しません。例えば、☕.examplexn--53h.exampleとなり、失敗にはなりません。[UTS46] [RFC5890]

domain to Unicodeアルゴリズムは、ドメイン domainと真偽値beStrictを受け取り、以下の手順を実行します:

  1. resultを、domain_namedomainCheckHyphensbeStrictCheckBidiにtrue、CheckJoinersにtrue、UseSTD3ASCIIRulesbeStrictTransitional_Processingにfalse、IgnoreInvalidPunycodeにfalseをセットしてUnicode ToUnicodeを実行した結果とする。[UTS46]

  2. 返されたエラーに対してdomain-to-Unicode バリデーションエラーを示し、その後resultを返す。

3.4. ホストの記述

有効なホスト文字列は、有効なドメイン文字列有効なIPv4アドレス文字列、またはU+005B([)、有効なIPv6アドレス文字列、U+005D(])のいずれかでなければなりません。

文字列 inputは、次の手順でtrueを返す場合、有効なドメインです:

  1. domaininputとtrueでdomain to ASCIIした結果とする。

  2. domainが失敗ならfalse、そうでなければtrueを返す。

理想的には、有効なドメインを構成するコードポイント列で定義したいが、現状は個別対応になっている:issue 245参照。

有効なドメイン文字列は、有効なドメインである文字列でなければなりません。

有効なIPv4アドレス文字列は、0~255の範囲の10進数を表すASCII数字による最短文字列4つをU+002E(.)で区切ったものです。

有効なIPv6アドレス文字列は、IP Version 6 Addressing Architectureの「Text Representation of Addresses」章で定義されています。[RFC4291]

有効な不透明ホスト文字列は、以下のいずれかでなければなりません:

これは有効なホスト文字列の定義には含まれません。区別には文脈が必要なためです。

3.5. ホストの解析

ホストパーサーは、スカラー値文字列 inputと省略可能な真偽値isOpaque(デフォルトfalse)を受け取り、以下の手順を実行します。失敗またはホストを返します。

  1. inputがU+005B([)で始まる場合:

    1. inputがU+005D(])で終わらなければ、IPv6-unclosed バリデーションエラーとして失敗を返す。

    2. 先頭のU+005B([)と末尾のU+005D(])を除いたinputIPv6解析した結果を返す。

  2. isOpaqueがtrueなら、input不透明ホスト解析した結果を返す。

  3. アサート:inputは空文字列ではない。

  4. domaininputパーセントデコードBOMなしUTF-8デコードした結果とする。

    あるいはBOMなしUTF-8デコード(failあり)を使い、失敗なら早期リターンも可。domain to ASCIIはU+FFFD(�)で失敗します。

  5. asciiDomaindomainとfalseでdomain to ASCIIした結果とする。

  6. asciiDomainが失敗なら失敗を返す。

  7. asciiDomain数字で終わる場合は、asciiDomainIPv4解析した結果を返す。

  8. asciiDomainを返す。


数字で終わるか判定は、ASCII文字列 inputを受け取り、以下の手順を実行します。真偽値を返します。

  1. partsinputをU+002E(.)で厳密分割した結果とする。

  2. partsの最後の要素が空文字列なら:

    1. partsサイズが1ならfalseを返す。

    2. partsの最後の要素削除する。

  3. lastpartsの最後の要素とする。

  4. lastが空でなく、全てASCII数字ならtrueを返す。

    誤った入力「09」は後のIPv4パーサーで検出されます。

  5. lastIPv4数値として解析して失敗でなければtrueを返す。

    これはlastが「0X」または「0x」で始まり、その後ASCII16進数字が続くかどうかの判定と同等です。

  6. falseを返す。

IPv4パーサーは、ASCII文字列 inputを受け取り、以下の手順を実行します。失敗またはIPv4アドレスを返します。

IPv4パーサーは直接呼び出さず、ホストパーサーの返値がIPv4アドレスかどうかで判断すること。

  1. partsinputをU+002E(.)で厳密分割した結果とする。

  2. partsの最後の要素が空文字列なら:

    1. IPv4-empty-part バリデーションエラー

    2. partsサイズが1より大きければ、最後の要素削除する。

  3. partsサイズが4を超えるなら、IPv4-too-many-parts バリデーションエラーとして失敗を返す。

  4. numbersを空のリストとする。

  5. partに対して:

    1. resultpartIPv4数値解析した結果とする。

    2. resultが失敗なら、IPv4-non-numeric-part バリデーションエラーとして失敗を返す。

    3. result[1]がtrueなら、IPv4-non-decimal-part バリデーションエラー

    4. result[0]をnumbers追加する。

  6. numbersのいずれかが255を超えていれば、IPv4-out-of-range-part バリデーションエラー

  7. 最後以外のnumbers要素が255を超えていたら失敗を返す。

  8. 最後のnumbers要素が256(5 − numbersサイズ)以上なら失敗を返す。

  9. ipv4numbersの最後の要素とする。

  10. numbersの最後の要素削除する。

  11. counterを0とする。

  12. nに対して:

    1. ipv4n × 256(3 − counter)を加算する。

    2. counterを1増やす。

  13. ipv4を返す。

IPv4数値パーサーは、ASCII文字列 inputを受け取り、以下の手順を実行します。失敗または数値と真偽値のタプルを返します。

  1. inputが空文字列なら失敗を返す。

  2. validationErrorをfalseとする。

  3. Rを10とする。

  4. inputが2文字以上かつ先頭2文字が"0X"または"0x"なら:

    1. validationErrorをtrueにする。

    2. inputの先頭2文字を削除する。

    3. Rを16にする。

  5. そうでなくinputが2文字以上かつ先頭文字がU+0030(0)なら:

    1. validationErrorをtrueにする。

    2. inputの先頭1文字を削除する。

    3. Rを8にする。

  6. inputが空文字列なら(0, true)を返す。

  7. inputに基数Rの数字でないコードポイントが含まれていれば失敗を返す。

  8. outputinputを基数Rとし、0~15はASCII16進数字として表した整数値とする。

  9. (output, validationError)を返す。


IPv6パーサーは、スカラー値文字列 inputを受け取り、以下の手順を実行します。失敗またはIPv6アドレスを返します。

IPv6パーサーは理論上直接呼び出し可能ですが、実際に行う場合は編集者と相談してください。

  1. addressを全てのピースが0の新しいIPv6アドレスとする。

  2. pieceIndexを0とする。

  3. compressをnullとする。

  4. pointerinput用のポインターとする。

  5. cがU+003A(:)なら:

    1. remainingがU+003A(:)で始まらなければ、IPv6-invalid-compression バリデーションエラーとして失敗を返す。

    2. pointerを2増やす。

    3. pieceIndexを1増やしてcompresspieceIndexをセットする。

  6. cEOFコードポイントでない間:

    1. pieceIndexが8なら、IPv6-too-many-pieces バリデーションエラーとして失敗を返す。

    2. cがU+003A(:)なら:

      1. compressが非nullなら、IPv6-multiple-compression バリデーションエラーとして失敗を返す。

      2. pointerpieceIndexを1ずつ増やし、compresspieceIndexをセットし、continueする。

    3. valuelengthを0とする。

    4. lengthが4未満かつcASCII16進数字である間、valuevalue×0x10 + c(16進数)として、pointerlengthを1ずつ増やす。

    5. cがU+002E(.)なら:

      1. lengthが0なら、IPv4-in-IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

      2. pointerlength分減らす。

      3. pieceIndexが6より大きければ、IPv4-in-IPv6-too-many-pieces バリデーションエラーとして失敗を返す。

      4. numbersSeenを0とする。

      5. cEOFコードポイントでない間:

        1. ipv4Pieceをnullとする。

        2. numbersSeenが0より大きいなら:

          1. cがU+002E(.)かつnumbersSeenが4未満ならpointerを1増やす。

          2. そうでなければ、IPv4-in-IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

        3. cASCII数字でなければ、IPv4-in-IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

        4. cASCII数字である間:

          1. numbercを10進数とした値とする。

          2. ipv4Pieceがnullならnumberをセット。

            そうでなくipv4Pieceが0なら、IPv4-in-IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

            そうでなければ、ipv4Pieceipv4Piece × 10 + numberとする。

          3. ipv4Pieceが255を超えていれば、IPv4-in-IPv6-out-of-range-part バリデーションエラーとして失敗を返す。

          4. pointerを1増やす。

        5. address[pieceIndex]をaddress[pieceIndex] × 0x100 + ipv4Pieceとする。

        6. numbersSeenを1増やす。

        7. numbersSeenが2または4であればpieceIndexを1増やす。

      6. numbersSeenが4でなければ、IPv4-in-IPv6-too-few-parts バリデーションエラーとして失敗を返す。

      7. breakする。

    6. そうでなければcがU+003A(:)なら:

      1. pointerを1増やす。

      2. cEOFコードポイントなら、IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

    7. そうでなくcEOFコードポイントでなければ、IPv6-invalid-code-point バリデーションエラーとして失敗を返す。

    8. address[pieceIndex]にvalueをセットする。

    9. pieceIndexを1増やす。

  7. compressが非nullなら:

    1. swapspieceIndexcompressとする。

    2. pieceIndexを7とする。

    3. pieceIndexが0でなくswapsが0より大きい間、address[pieceIndex]とaddress[compress + swaps − 1]を入れ替えて、pieceIndexswapsを1ずつ減らす。

  8. そうでなくcompressがnullかつpieceIndexが8でなければ、IPv6-too-few-pieces バリデーションエラーとして失敗を返す。

  9. addressを返す。


不透明ホストパーサーは、スカラー値文字列 inputを受け取り、以下の手順を実行します。失敗または不透明ホストを返します。

  1. input禁止ホストコードポイントが含まれていれば、host-invalid-code-point バリデーションエラーとして失敗を返す。

  2. inputコードポイントURLコードポイントでないもの、かつU+0025(%)でないものが含まれていれば、invalid-URL-unit バリデーションエラー

  3. inputにU+0025(%)が含まれていて、直後の2つのコードポイントASCII16進数字でなければ、invalid-URL-unit バリデーションエラー

  4. inputUTF-8パーセントエンコードC0制御パーセントエンコードセット使用)した結果を返す。

3.6. ホストの直列化

ホストシリアライザーは、ホスト hostを受け取り、以下の手順を実行します。ASCII文字列を返します。

  1. hostIPv4アドレスなら、hostIPv4シリアライザーを実行した結果を返す。

  2. そうでなくhostIPv6アドレスなら、U+005B([)、hostIPv6シリアライザーを実行した結果、U+005D(])の順で返す。

  3. そうでなければ、hostドメイン不透明ホスト空ホストのいずれかなので、hostを返す。

IPv4シリアライザーは、IPv4アドレス addressを受け取り、以下の手順を実行します。ASCII文字列を返します。

  1. outputを空文字列とする。

  2. naddressの値とする。

  3. 1から4までの範囲iごとに:

    1. outputの先頭にn % 256を直列化した結果を追加する。

    2. iが4でなければ、outputの先頭にU+002E(.)を追加する。

    3. nをfloor(n / 256)にする。

  4. outputを返す。

IPv6シリアライザーは、IPv6アドレス addressを受け取り、以下の手順を実行します。ASCII文字列を返します。

  1. outputを空文字列とする。

  2. compressaddressIPv6アドレス圧縮ピースインデックス探索を実行した結果とする。

  3. ignore0をfalseとする。

  4. addressのピースのインデックスごとに:

    1. ignore0がtrueかつaddress[pieceIndex]が0なら、continueする。

    2. そうでなくignore0がtrueなら、ignore0をfalseにする。

    3. compresspieceIndexなら:

      1. separatorpieceIndexが0なら"::"、それ以外ならU+003A(:)とする。

      2. separatoroutputに追加する。

      3. ignore0をtrueにしてcontinueする。

    4. address[pieceIndex]を最短の小文字16進数で表してoutputに追加する。

    5. pieceIndexが7でなければ、outputにU+003A(:)を追加する。

  5. outputを返す。

このアルゴリズムは「A Recommendation for IPv6 Address Text Representation」の推奨に従う必要があります。[RFC5952]

IPv6アドレス圧縮ピースインデックス探索は、IPv6アドレス addressを受け取り:

  1. longestIndexをnullとする。

  2. longestSizeを1とする。

  3. foundIndexをnullとする。

  4. foundSizeを0とする。

  5. addressのピースのインデックスごとに:

    1. addressのピース[pieceIndex]が0でなければ:

      1. foundSizelongestSizeより大きければ、longestIndexfoundIndexlongestSizefoundSizeをセットする。

      2. foundIndexをnullにする。
      3. foundSizeを0にする。
    2. そうでなければ:

      1. foundIndexがnullならfoundIndexpieceIndexをセットする。

      2. foundSizeを1増やす。

  6. foundSizelongestSizeより大きければfoundIndexを返す。

  7. longestIndexを返す。

0:f:0:0:f:f:0:0」の場合、2番目の0を指すことになります。

3.7. ホストの同値性

ホスト A等価かどうかを判定するには、ホスト Bと比較し、ABであればtrue、そうでなければfalseを返します。

証明書比較では、ドメインの末尾のドット(あれば)を無視した同値性判定が必要です。ただし、証明書ホストはDNS長なども強制されますが、URLではここで強制されません。両者をより近づける方法や統一モデルの良案があれば、issueをファイルしてください。

4. URL

概要では、URL有効なURL文字列URLパーサーURLシリアライザーは以下のように関係します:

入力 基準 有効 出力
https:example.org https://example.org/
https://////example.com/// https://example.com///
https://example.com/././foo https://example.com/foo
hello:world https://example.com/ hello:world
https:example.org https://example.com/ https://example.com/example.org
\example\..\demo/.\ https://example.com/ https://example.com/demo/
example https://example.com/demo https://example.com/example
file:///C|/demo file:///C:/demo
.. file:///C:/demo file:///C:/
file://loc%61lhost/ file:///
https://user:password@example.org/ https://user:password@example.org/
https://example.org/foo bar https://example.org/foo%20bar
https://EXAMPLE.com/../x https://example.com/x
https://ex ample.org/ 失敗
example ❌(基準不足) 失敗
https://example.com:demo 失敗
http://[www.example.com]/ 失敗
https://example.org// https://example.org//
https://example.com/[]?[]#[] https://example.com/[]?[]#[]
https://example/%?%#% https://example/%?%#%
https://example/%25?%25#%25 https://example/%25?%25#%25

基準および出力のURLは簡潔のため直列化形式で表現されています。

4.1. URLの表現

URLは、ユニバーサル識別子を表す構造体です。有効なURL文字列と区別するため、URLレコードとも呼ばれます。

URLスキームは、ASCII文字列で、URLの種類を識別し、解析後に追加処理を行う際の分岐に使われます。初期値は空文字列です。

URLユーザー名は、ASCII文字列でユーザー名を識別します。初期値は空文字列です。

URLパスワードは、ASCII文字列でパスワードを識別します。初期値は空文字列です。

URLホストはnullまたはホストです。初期値はnullです。

下表は許可されるURLスキームホストの組み合わせを示します。

スキーム ホスト
ドメイン IPv4アドレス IPv6アドレス 不透明ホスト 空ホスト null
特別なスキーム("file"を除く)
"file"
その他

URLポートはnullまたは16ビット符号なし整数で、ネットワークポートを識別します。初期値はnullです。

URLパスURLパスで、通常は場所を識別します。初期値は« »です。

特別URLパスは常にリストであり、不透明にはなりません。

URLクエリはnullまたはASCII文字列です。初期値はnullです。

URLフラグメントはnullまたはASCII文字列で、URLの他のコンポーネントが識別するリソースの追加処理に使うことができます。初期値はnullです。

URLはさらに、関連付けられたblob URLエントリ(nullまたはblob URL entry)を持ちます。初期値はnullです。

これは、"blob" URLが参照するオブジェクトやそのオリジンをキャッシュするために使われます。これらは、URLblob URLストアからパース後に削除されても、フェッチ時に取得できるようにキャッシュされる必要があります。

下表は有効なURL文字列解析したときのURLの各コンポーネントへの対応を示します。ユーザー名パスワードblob URLエントリは省略しています(以下の例では空文字列、空文字列、null)。

入力 スキーム ホスト ポート パス クエリ フラグメント
https://example.com/ "https" "example.com" null « 空文字列 » null null
https://localhost:8000/search?q=text#hello "https" "localhost" 8000 « "search" » "q=text" "hello"
urn:isbn:9780307476463 "urn" null null "isbn:9780307476463" null null
file:///ada/Analytical%20Engine/README.md "file" null null « "ada", "Analytical%20Engine", "README.md" » null null

URLパスは、URLパスセグメントまたは0個以上のリストURLパスセグメントのリスト)です。

URLパスセグメントASCII文字列です。一般的にはディレクトリやファイルを指しますが、固定の意味はありません。

単一ドットURLパスセグメントは、URLパスセグメントで"."または"%2e"(ASCII大文字小文字区別せず一致)です。

二重ドットURLパスセグメントは、URLパスセグメントで".."または".%2e"、"%2e."、"%2e%2e"(ASCII大文字小文字区別せず一致)です。

4.2. URLその他

特別なスキームは、次の表の第1列に記載されたASCII文字列です。特別なスキームデフォルトポートは同じ行の第2列に記載されています。その他のASCII文字列のデフォルトポートはnullです。

特別なスキーム デフォルトポート
"ftp" 21
"file" null
"http" 80
"https" 443
"ws" 80
"wss" 443

URLは、そのスキーム特別なスキームであれば特別です。URLは、スキーム特別なスキームでなければ特別ではないです。

URLは、ユーザー名またはパスワードが空文字列でなければ認証情報を含むといいます。

URLは、不透明パスを持つ場合、そのパスURLパスセグメントです。

URLは、ホストがnullまたは空文字列である、またはスキームが"file"の場合、ユーザー名/パスワード/ポートを持てないです。

URL基準URLとして指定できます。

基準URLは、入力が相対URL文字列である場合、URLパーサーで役立ちます。


Windowsドライブレターは2つのコードポイントで、最初がASCII英字、2番目がU+003A(:)またはU+007C(|)です。

正規化Windowsドライブレターは、2番目のコードポイントがU+003A(:)であるWindowsドライブレターです。

URLの記述セクションに従い、正規化Windowsドライブレターのみが適合となります。

文字列が、以下すべてを満たす場合、Windowsドライブレターで始まるといいます:

文字列 Windowsドライブレターで始まるか
"c:"
"c:/"
"c:a"

urlパスを短縮するには:

  1. アサートurl不透明パスではない

  2. pathurlパスとする。

  3. urlスキームが"file"、pathサイズが1、path[0]が正規化Windowsドライブレターなら、何もしないで返す。

  4. pathの末尾要素があれば削除する。

4.3. URLの記述

有効なURL文字列は、相対URL(フラグメント付き)文字列または絶対URL(フラグメント付き)文字列のいずれかでなければなりません。

絶対URL(フラグメント付き)文字列は、絶対URL文字列、任意でU+0023(#)とURLフラグメント文字列が続くものです。

絶対URL文字列は、以下のいずれかでなければなりません:

いずれも任意でU+003F(?)、URLクエリ文字列が続く場合があります。

URLスキーム文字列は、1つのASCII英字、続いて0個以上のASCII英数字、U+002B(+)、U+002D(-)、U+002E(.)です。スキームIANA URI [sic] Schemesレジストリに登録すべきです。[IANA-URI-SCHEMES] [RFC7595]

相対URL(フラグメント付き)文字列は、相対URL文字列、任意でU+0023(#)、URLフラグメント文字列が続くものです。

相対URL文字列は、基準URLスキームによって次のいずれかになります:

特別なスキーム("file"を除く)

スキーム相対特別URL文字列

パス絶対URL文字列

スキームレスパス相対URL文字列

"file"

スキーム相対file-URL文字列

パス絶対URL文字列基準URLホスト空ホストの場合)

Windows以外パス絶対file-URL文字列基準URLホスト空ホストでない場合)

スキームレスパス相対URL文字列

その他

スキーム相対URL文字列

パス絶対URL文字列

スキームレスパス相対URL文字列

いずれも任意でU+003F(?)、URLクエリ文字列が続く場合があります。

基準URLが非nullであることは、相対URL文字列の解析時に必要です。

スキーム相対特別URL文字列は、"//"、有効なホスト文字列、任意でU+003A(:)、URLポート文字列、任意でパス絶対URL文字列が続くものです。

URLポート文字列は、次のいずれかでなければなりません:

スキーム相対URL文字列は、"//"、不透明ホスト+ポート文字列、任意でパス絶対URL文字列が続くものです。

不透明ホスト+ポート文字列は、空文字列または有効な不透明ホスト文字列、任意でU+003A(:)、URLポート文字列です。

スキーム相対file-URL文字列は、"//"、次のいずれか:

パス絶対URL文字列は、U+002F(/)、パス相対URL文字列が続くものです。

Windows以外パス絶対file-URL文字列は、パス絶対URL文字列で、U+002F(/)とWindowsドライブレター、U+002F(/)の並びで始まらないものです。

パス相対URL文字列は、0個以上のURLパスセグメント文字列をU+002F(/)で区切ったもの(先頭はU+002F(/)で始まらない)です。

スキームレスパス相対URL文字列は、パス相対URL文字列で、URLスキーム文字列、U+003A(:)で始まらないものです。

URLパスセグメント文字列は、次のいずれか:

URLクエリ文字列は、0個以上のURL単位です。

URLフラグメント文字列は、0個以上のURL単位です。

URLコードポイントは、ASCII英数字、 U+0021(!), U+0024($), U+0026(&), U+0027('), U+0028((), U+0029()), U+002A(*), U+002B(+), U+002C(,), U+002D(-), U+002E(.), U+002F(/), U+003A(:), U+003B(;), U+003D(=), U+003F(?), U+0040(@), U+005F(_), U+007E(~), U+00A0~U+10FFFD(コードポイント、サロゲート・非文字除く)です。

U+007F(DELETE)より大きいコードポイントは、パーセントエンコードされたバイトURLパーサーで変換されます。

HTMLでは、文書エンコーディングがレガシーエンコーディングの場合、URLクエリ文字列内でU+007F(DELETE)より大きいコードポイントは文書のエンコーディングパーセントエンコードされたバイトに変換されます。異なるエンコーディングの文書間でURLをコピーすると問題が起きることがあります。常にUTF-8を使うことで解決できます。

例えば、次のHTML文書:

<!doctype html>
<meta charset="windows-1252">
<a href="?sm&ouml;rg&aring;sbord">Test</a>

文書エンコーディングがwindows-1252なので、リンクのURLクエリは"sm%F6rg%E5sbord"になります。もしUTF-8なら"sm%C3%B6rg%C3%A5sbord"になります。

URL単位は、URLコードポイントパーセントエンコードされたバイトです。

パーセントエンコードされたバイトは、URLコードポイントでないものや記述から除外されるものをエンコードできます。


ユーザー名パスワードURLレコード内で有効なURL文字列として表現する方法はありません。

4.4. URLの解析

URLパーサーは、スカラー値文字列 input、省略可能なnullまたは基準URL base(デフォルトnull)、省略可能なエンコーディング encoding(デフォルトUTF-8)を受け取り、以下の手順を実行します:

非Webブラウザ実装は基本URLパーサーのみ実装すれば十分です。

Webブラウザのアドレスバーのユーザー入力がURLレコードに変換される過程は現行標準の範囲外です。この標準ではURLレンダリング要件(信頼判断に関わる部分)は含まれています。

  1. urlinputbaseencoding基本URLパーサーした結果とする。

  2. urlが失敗なら失敗を返す。

  3. urlスキームが"blob"でなければurlを返す。

  4. urlblob URLエントリblob URL解決(失敗でなければその結果、失敗ならnull)にセットする。

  5. urlを返す。


基本URLパーサーは、スカラー値文字列 input、省略可能なnullまたは基準URL base(デフォルトnull)、省略可能なエンコーディング encoding(デフォルトUTF-8)、省略可能なURL url、省略可能な状態オーバーライドstate overrideを受け取り、以下の手順を実行します:

encoding引数はHTML向けのレガシー概念です。urlstate override引数は各種APIでのみ使用されます。[HTML]

urlstate overrideが与えられない場合、基本URLパーサーは新しいURLまたは失敗を返します。与えられた場合は、そのurlを変更し、何も返さず終了することがあります。

  1. もしurlが指定されていなければ:

    1. urlに新しいURLをセットする。

    2. inputに先頭または末尾にC0制御文字またはスペースが含まれていたら、invalid-URL-unit バリデーションエラーとする。

    3. inputの先頭と末尾からC0制御文字またはスペースをすべて削除する。

  2. inputASCIIタブまたは改行が含まれていたら、invalid-URL-unit バリデーションエラーとする。

  3. inputからすべてのASCIIタブまたは改行を削除する。

  4. statestate overrideがあればそれを、なければスキーム開始状態とする。

  5. encodingencodingから出力エンコーディング取得した結果にセットする。

  6. bufferを空文字列とする。

  7. atSignSeeninsideBracketspasswordTokenSeenをfalseとする。

  8. pointerinput用のポインターとする。

  9. 以下の状態機械をstateに応じて切り替えながら実行し続ける。もし実行後にpointerEOFコードポイントを指していたら次のステップに進む。そうでなければpointerを1増やして状態機械を続ける。

    スキーム開始状態
    1. cASCII英字なら、c小文字化)をbufferに追加し、stateスキーム状態にする。

    2. それ以外でstate overrideが指定されていなければ、state非スキーム状態にし、pointerを1減らす。

    3. それ以外なら失敗を返す。

      この失敗はLocationオブジェクトのprotocolセッター専用です。

    スキーム状態
    1. cASCII英数字、U+002B(+)、U+002D(-)、U+002E(.)なら、c小文字化)をbufferに追加する。

    2. それ以外でcがU+003A(:)なら:

      1. state overrideが指定されていれば:

        1. urlスキーム特別なスキームで、bufferが特別なスキームでなければreturn。

        2. urlスキームが特別なスキームでなく、bufferが特別なスキームならreturn。

        3. url認証情報を含むまたはportがnullでなく、かつbufferが"file"ならreturn。

        4. urlスキームが"file"で、host空ホストならreturn。

      2. urlスキームbufferをセットする。

      3. state overrideが指定されていれば:

        1. urlportデフォルトポートなら、urlのportをnullにする。

        2. return。

      4. bufferを空文字列にセットする。

      5. urlスキームが"file"なら:

        1. remainingが"//"で始まらなければ、special-scheme-missing-following-solidus バリデーションエラー

        2. statefile状態にセットする。

      6. それ以外でurl特別baseがnullでなく、baseスキームurlのスキームなら:

        1. アサートbaseは特別(不透明パスを持たない)。

        2. statespecial relative or authority状態にセットする。

      7. それ以外でurlが特別なら、statespecial authority slashes状態にセットする。

      8. それ以外でremainingがU+002F(/)で始まるなら、statepath or authority状態にし、pointerを1増やす。

      9. それ以外ならurlpathを空文字列にセットし、state不透明パス状態に。

    3. それ以外でstate overrideが指定されていなければ、bufferを空文字列、state非スキーム状態にし、inputの最初からやり直す。

    4. それ以外なら失敗を返す。

      この失敗はLocationオブジェクトのprotocolセッター専用です。また前段の非失敗returnはこのセッター定義のための意図的な差異です。

    非スキーム状態
    1. baseがnull、またはbase不透明パスを持ち、cがU+0023(#)でなければ、missing-scheme-non-relative-URL バリデーションエラー、失敗を返す。

    2. それ以外でbaseが不透明パスを持ち、cがU+0023(#)なら、urlschemebaseschemeを、urlpathbasepathを、urlquerybasequeryを、urlfragmentに空文字列をセットし、statefragment状態にする。

    3. それ以外でbaseschemeが"file"でなければ、staterelative状態にし、pointerを1減らす。

    4. それ以外はstatefile状態にし、pointerを1減らす。

    special relative or authority状態
    1. cがU+002F(/)で、remainingがU+002F(/)で始まるなら、statespecial authority ignore slashes状態にし、pointerを1増やす。

    2. それ以外はspecial-scheme-missing-following-solidus バリデーションエラーstaterelative状態にし、pointerを1減らす。

    path or authority状態
    1. cがU+002F(/)なら、stateauthority状態にする。

    2. それ以外はstatepath状態にし、pointerを1減らす。

    relative状態
    1. アサート:baseschemeは"file"でない。

    2. urlschemebaseschemeをセット。

    3. cがU+002F(/)なら、staterelative slash状態にする。

    4. それ以外でurl特別cがU+005C(\)なら、invalid-reverse-solidus バリデーションエラーstaterelative slash状態にする。

    5. それ以外:

      1. urlusernamebaseusernameを、urlpasswordbasepasswordを、urlhostbasehostを、urlportbaseportを、urlpathbasecloneしたpathを、urlquerybasequeryをセット。

      2. cがU+003F(?)なら、urlqueryに空文字列をセットし、statequery状態にする。

      3. それ以外でcがU+0023(#)なら、urlfragmentに空文字列をセットし、statefragment状態にする。

      4. それ以外でcEOFコードポイントでなければ:

        1. urlqueryをnullにする。

        2. shortenurlpathを短縮。

        3. statepath状態にし、pointerを1減らす。

    relative slash状態
    1. url特別cがU+002F(/)またはU+005C(\)なら:

      1. cがU+005C(\)なら、invalid-reverse-solidus バリデーションエラー

      2. statespecial authority ignore slashes状態にする。

    2. それ以外でcがU+002F(/)なら、stateauthority状態にする。

    3. それ以外はurlusernamebaseusernameを、urlpasswordbasepasswordを、urlhostbasehostを、urlportbaseportをセットし、statepath状態にし、pointerを1減らす。

    special authority slashes状態
    1. cがU+002F(/)で、remainingがU+002F(/)で始まるなら、statespecial authority ignore slashes状態にし、pointerを1増やす。

    2. それ以外はspecial-scheme-missing-following-solidus バリデーションエラーstatespecial authority ignore slashes状態にし、pointerを1減らす。

    special authority ignore slashes状態
    1. cがU+002F(/)でもU+005C(\)でもなければ、stateauthority状態にし、pointerを1減らす。

    2. それ以外はspecial-scheme-missing-following-solidus バリデーションエラー

    authority状態
    1. cがU+0040(@)なら:

      1. Invalid-credentials バリデーションエラー

      2. atSignSeenがtrueなら、"%40"をbufferの先頭に追加。

      3. atSignSeenをtrueにセット。

      4. bufferの各codePointについて:

        1. codePointがU+003A(:)でpasswordTokenSeenがfalseなら、passwordTokenSeenをtrueにし、continue

        2. encodedCodePointsUTF-8 percent-encodecodePointuserinfo percent-encode setで変換した結果とする。

        3. passwordTokenSeenがtrueならencodedCodePointsurlpasswordに追加。

        4. それ以外はencodedCodePointsurlusernameに追加。

      5. bufferを空文字列にセット。

    2. それ以外で以下のいずれかが真なら:

      なら:

      1. atSignSeenがtrueかつbufferが空文字列なら、host-missing バリデーションエラー、失敗を返す。

      2. pointerbufferコードポイント長+1減らし、bufferを空文字列にし、statehost状態に。

    3. それ以外はcbufferに追加。

    host状態
    hostname状態
    1. state overrideが指定されていて、urlschemeが"file"なら、pointerを1減らし、statefile host状態にする。

    2. それ以外でcがU+003A(:)かつinsideBracketsがfalseなら:

      1. bufferが空文字列なら、host-missing バリデーションエラー、失敗を返す。

      2. state overrideが指定されていて、state overrideがhostname状態なら、失敗を返す。

      3. hosthost parsingbufferurl特別でないとして解析した結果とする。

      4. hostが失敗なら失敗を返す。

      5. urlhosthostbufferを空文字列、stateport状態に。

    3. それ以外で以下のいずれかが真なら:

      なら、pointerを1減らし:

      1. urlが特別かつbufferが空文字列なら、host-missing バリデーションエラー、失敗を返す。

      2. それ以外でstate overrideが指定され、bufferが空文字列かつurl認証情報を含むまたはurlportがnullでないなら、失敗を返す。

      3. hosthost parsingbufferurl特別でないとして解析した結果とする。

      4. hostが失敗なら失敗を返す。

      5. urlhosthostbufferを空文字列、statepath start状態に。

      6. state overrideが指定されていればreturn。

    4. それ以外:

      1. cがU+005B([)ならinsideBracketsをtrueに。

      2. cがU+005D(])ならinsideBracketsをfalseに。

      3. cbufferに追加。

    port状態
    1. cASCII数字なら、cbufferに追加。

    2. それ以外で以下のいずれかが真なら:

      なら:

      1. bufferが空文字列でなければ:

        1. portbufferを基数10としてASCII数字で表した整数値とする。

        2. port16ビット符号なし整数でなければ、port-out-of-range バリデーションエラー、失敗を返す。

        3. porturlschemeデフォルトポートなら、urlportをnullに、そうでなければその値に。

        4. bufferを空文字列にセット。

        5. state overrideが指定されていればreturn。

      2. state overrideが指定されていれば失敗を返す。

      3. statepath start状態にし、pointerを1減らす。

    3. それ以外はport-invalid バリデーションエラー、失敗を返す。

    file状態
    1. urlschemeに"file"をセットする。

    2. urlhostを空文字列にセットする。

    3. cがU+002F(/)またはU+005C(\)なら:

      1. cがU+005C(\)なら、invalid-reverse-solidus バリデーションエラー

      2. statefile slash状態にする。

    4. それ以外でbaseがnullでなく、baseschemeが"file"なら:

      1. urlhostbasehosturlpathbasecloneしたpathurlquerybasequeryをセット。

      2. cがU+003F(?)なら、urlqueryを空文字列に、statequery状態にする。

      3. それ以外でcがU+0023(#)なら、urlfragmentを空文字列、statefragment状態にする。

      4. それ以外でcEOFコードポイントでなければ:

        1. urlqueryをnullにする。

        2. pointerからinput末尾までのコードポイント部分文字列がWindowsドライブレターで始まるでなければ、shortenurlpathを短縮。

        3. それ以外:

          1. File-invalid-Windows-drive-letter バリデーションエラー

          2. urlpathを« »にセット。

          これは(プラットフォーム非依存の)Windowsドライブレターの特殊挙動です。

        4. statepath状態にし、pointerを1減らす。

    5. それ以外はstatepath状態にし、pointerを1減らす。

    file slash状態
    1. cがU+002F(/)またはU+005C(\)なら:

      1. cがU+005C(\)なら、invalid-reverse-solidus バリデーションエラー

      2. statefile host状態にする。

    2. それ以外:

      1. baseがnullでなく、baseschemeが"file"なら:

        1. urlhostbasehostをセット。

        2. pointerからinput末尾までのコードポイント部分文字列がWindowsドライブレターで始まるでなく、かつbasepath[0]が正規化Windowsドライブレターなら、appendbaseのpath[0]をurlのpathに追加。

          これは(プラットフォーム非依存の)Windowsドライブレターの特殊挙動です。

      2. statepath状態にし、pointerを1減らす。

    file host状態
    1. cEOFコードポイント、U+002F(/)、U+005C(\)、U+003F(?)、U+0023(#)なら、pointerを1減らし:

      1. state overrideが指定されていなくて、bufferWindowsドライブレターなら、file-invalid-Windows-drive-letter-host バリデーションエラーstatepath状態に。

        これは(プラットフォーム非依存の)Windowsドライブレターの特殊挙動です。bufferはここでリセットされず、path状態で利用されます。

      2. それ以外でbufferが空文字列なら:

        1. urlhostを空文字列に。

        2. state overrideが指定されていればreturn。

        3. statepath start状態に。

      3. それ以外は以下の手順を実行:

        1. hosthost parsingbufferurl特別でないとして解析した結果とする。

        2. hostが失敗なら失敗を返す。

        3. hostが"localhost"なら、hostを空文字列に。

        4. urlhosthostをセット。

        5. state overrideが指定されていればreturn。

        6. bufferを空文字列にし、statepath start状態に。

    2. それ以外はcbufferに追加。

    path start状態
    1. url特別なら:

      1. cがU+005C(\)なら、invalid-reverse-solidus バリデーションエラー

      2. statepath状態に。

      3. cがU+002F(/)でもU+005C(\)でもなければ、pointerを1減らす。

    2. それ以外でstate overrideが指定されていなくて、cがU+003F(?)なら、urlqueryを空文字列にし、statequery状態に。

    3. それ以外でstate overrideが指定されていなくて、cがU+0023(#)なら、urlfragmentを空文字列にし、statefragment状態に。

    4. それ以外でcEOFコードポイントでなければ:

      1. statepath状態に。

      2. cがU+002F(/)でなければ、pointerを1減らす。

    5. それ以外でstate overrideが指定されていて、urlhostがnullなら、appendで空文字列をurlpathに追加。

    path状態
    1. 以下のいずれかが真なら:

      • cEOFコードポイントまたはU+002F(/)

      • url特別cがU+005C(\)

      • state overrideが指定されていなくて、cがU+003F(?)またはU+0023(#)

      なら:

      1. urlが特別かつcがU+005C(\)なら、invalid-reverse-solidus バリデーションエラー

      2. buffer二重ドットURLパスセグメントなら:

        1. shortenurlpathを短縮。

        2. cがU+002F(/)でない、またはurlが特別でcがU+005C(\)でないなら、appendで空文字列をurlpathに追加。

          例えば/usr/..の場合、結果は/(パスなしではなく)になる。

      3. それ以外でbuffer単一ドットURLパスセグメントかつcがU+002F(/)でない、またはurlが特別でcがU+005C(\)でないなら、appendで空文字列をurlpathに追加。

      4. それ以外でbufferが単一ドットURLパスセグメントでなければ:

        1. urlschemeが"file"かつurlpathが空で、bufferWindowsドライブレターなら、bufferの2番目のコードポイントをU+003A(:)に置換。

          これは(プラットフォーム非依存の)Windowsドライブレターの特殊挙動です。

        2. appendbufferurlpathに追加。

      5. bufferを空文字列にセット。

      6. cがU+003F(?)なら、urlqueryを空文字列にし、statequery状態に。

      7. cがU+0023(#)なら、urlfragmentを空文字列にし、statefragment状態に。

    2. それ以外は以下の手順を実行:

      1. cURLコードポイントでもU+0025(%)でもなければ、invalid-URL-unit バリデーションエラー

      2. cがU+0025(%)かつremainingがASCII16進数字2つで始まらなければ、invalid-URL-unit バリデーションエラー

      3. UTF-8 percent-encodecpath percent-encode setで変換し、その結果をbufferに追加。

    不透明パス状態
    1. cがU+003F(?)なら、urlqueryを空文字列にし、statequery状態に。

    2. それ以外でcがU+0023(#)なら、urlfragmentを空文字列にし、statefragment状態に。

    3. それ以外でcがU+0020(スペース)なら:

      1. remainingがU+003F(?)またはU+003F(#)で始まるなら、"%20"をurlpathに追加。

      2. それ以外はU+0020(スペース)をurlpathに追加。

    4. それ以外でcEOFコードポイントでなければ:

      1. cURLコードポイントでもU+0025(%)でもなければ、invalid-URL-unit バリデーションエラー

      2. cがU+0025(%)かつremainingがASCII16進数字2つで始まらなければ、invalid-URL-unit バリデーションエラー

      3. UTF-8 percent-encodecC0 control percent-encode setで変換し、その結果をurlpathに追加。

    query状態
    1. encodingUTF-8でなく、以下いずれかが真なら:

      ならencodingUTF-8にセット。

    2. 以下いずれかが真なら:

      なら:

      1. queryPercentEncodeSeturl特別ならspecial-query percent-encode set、それ以外はquery percent-encode setとする。

      2. Percent-encode after encodingencodingbufferqueryPercentEncodeSetを使い、その結果をurlqueryに追加。

        この操作は状態を持つISO-2022-JP encoderのためコードポイントごとの呼び出しは不可。

      3. bufferを空文字列にセット。

      4. cがU+0023(#)なら、urlfragmentを空文字列にし、stateをfragment状態に。

    3. それ以外でcEOFコードポイントでなければ:

      1. cURLコードポイントでもU+0025(%)でもなければ、invalid-URL-unit バリデーションエラー

      2. cがU+0025(%)かつremainingがASCII16進数字2つで始まらなければ、invalid-URL-unit バリデーションエラー

      3. cbufferに追加。

    fragment状態
    1. cEOFコードポイントでなければ:

      1. cURLコードポイントでもU+0025(%)でもなければ、invalid-URL-unit バリデーションエラー

      2. cがU+0025(%)かつremainingがASCII16進数字2つで始まらなければ、invalid-URL-unit バリデーションエラー

      3. UTF-8 percent-encodecfragment percent-encode setで変換し、その結果をurlfragmentに追加。

  10. urlを返す。


あるurlusernameユーザー名をセットするには、urlusernameusernameUTF-8 percent-encodeuserinfo percent-encode set使用)した結果をセットする。

あるurlpasswordパスワードをセットするには、urlpasswordpasswordUTF-8 percent-encodeuserinfo percent-encode set使用)した結果をセットする。

4.5. URLの直列化

URL直列化器は、URL url、省略可能な真偽値exclude fragment(デフォルトfalse)を受け取り、以下の手順を実行します。返り値はASCII文字列です。

  1. outputurlschemeとU+003A(:)を連結したものにする。

  2. urlhostがnullでなければ:

    1. outputに"//"を追加。

    2. url認証情報を含むなら:

      1. urlusernameoutputに追加。

      2. urlpasswordが空文字列でなければ、U+003A(:)とurlpasswordoutputに追加。

      3. U+0040(@)をoutputに追加。

    3. urlhost直列化済み)をoutputに追加。

    4. urlportがnullでなければ、U+003A(:)とurlport直列化済み)をoutputに追加。

  3. urlhostがnullで、url不透明パスを持たず、urlpathサイズが1より大きく、urlpath[0]が空文字列なら、U+002F(/)とU+002E(.)をoutputに追加。

    これはweb+demo:/.//not-a-host/web+demo:/path/..//not-a-host/解析直列化された際、web+demo://not-a-host/にならない(web+demo:/.//not-a-host/になる)ためです。

  4. URLパス直列化urlを直列化した結果をoutputに追加。

  5. urlqueryがnullでなければ、U+003F(?)とurlqueryoutputに追加。

  6. exclude fragmentがfalseで、urlfragmentがnullでなければ、U+0023(#)とurlfragmentoutputに追加。

  7. outputを返す。

URLパス直列化器は、URL urlを受け取り、以下の手順を実行します。返り値はASCII文字列です。

  1. url不透明パスを持つなら、urlpathを返す。

  2. outputを空文字列に。

  3. urlpathの各segmentについて:U+002F(/)とsegmentoutputに追加。

  4. outputを返す。

4.6. URLの同値性

URL A等しいかどうかを、URL Bに対して、オプションの真偽値exclude fragments(デフォルトfalse)で判定するには、以下の手順を実行します:

  1. serializedAA直列化した結果(exclude fragmentexclude fragmentsに設定)とする。

  2. serializedBB直列化した結果(exclude fragmentexclude fragmentsに設定)とする。

  3. serializedAserializedBならtrue、そうでなければfalseを返す。

4.7. オリジン

オリジンの定義はHTMLを参照してください。必要な背景情報が記載されています。[HTML]

オリジンは、URL urlについて、urlschemeで分岐し、以下の手順で得られるオリジンです:

"blob"
  1. urlblob URLエントリがnullでなければ、urlblob URLエントリenvironmentオリジンを返す。

  2. pathURL解析URLパス直列化したurlの結果とする。

  3. pathURLが失敗なら新しい不透明オリジンを返す。

  4. pathURLschemeが"http"、"https"、"file"なら、pathURLオリジンを返す。

  5. 新しい不透明オリジンを返す。

blob:https://whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6fオリジンは、タプルオリジン("https", "whatwg.org", null, null)です。

"ftp"
"http"
"https"
"ws"
"wss"

タプルオリジンurlschemeurlhosturlport、null)を返す。

"file"

残念ながらこれは読者への課題です。判断に迷った場合は、新しい不透明オリジンを返してください。

その他

新しい不透明オリジンを返す。

これは、これらURLが自分自身と同一オリジンになれないことを意味します。

4.8. URLのレンダリング

URLは、ユーザーがセキュリティや信頼に関する判断を行うために表示する場合、以下に記載する修正を加えた直列化済みの形でレンダリングされるべきです。例えば、ブラウザのアドレスバーではユーザーがURLを見て信頼判断をすることが期待されています。

4.8.1. 人が読めない/不要な構成要素の簡略化

なりすましやセキュリティに無関係な情報で混乱を招く構成要素を削除してください:

4.8.2. 省略表示

表示領域が限られている場合、URLの省略はユーザーに誤解を与えないよう慎重に行うべきです:

4.8.3. 国際化と特殊文字

国際化ドメイン名(IDN)、特殊文字、双方向テキストはなりすまし防止のため慎重に扱うべきです:

5. application/x-www-form-urlencoded

application/x-www-form-urlencoded形式は、名前と値からなるリストタプルをエンコードする方法を提供します。

application/x-www-form-urlencoded形式は、様々な実装上の事故や妥協の積み重ねによる異常な怪物であり、相互運用性のために必要な要件の集合となっていますが、良い設計とは言えません。特に、繰り返し(場合によってはネストされた)文字エンコーディングとバイト列の変換に関する複雑な詳細に注意してください。残念ながら、この形式はHTMLフォームの普及により広く使用されています。[HTML]

5.1. application/x-www-form-urlencoded のパース

レガシーなサーバ指向の実装では、UTF-8以外のエンコーディングや、名前が_charsetのタプルに特別なロジックが必要な場合があります。ここではそのようなロジックは説明されていません。準拠すべきはUTF-8のみです。

application/x-www-form-urlencodedパーサは、バイト列inputを受け取り、以下の手順を実行します:

  1. sequencesinputを0x26(&)で分割した結果とする。

  2. outputを、名前と値が文字列を保持するname-valueタプルの空のリストとする。

  3. sequences内の各バイト列bytesについて:

    1. bytesが空のバイト列なら、continue

    2. bytesが0x3D(=)を含むなら、namebytesの先頭から最初の0x3D(=)直前までのバイト列、valueを最初の0x3D(=)の直後から末尾までのバイト列(存在すれば)とする。0x3D(=)が最初のバイトならnameは空、最後ならvalueは空になる。

    3. それ以外はnamebytesvalueに空のバイト列をセットする。

    4. namevalue内の全ての0x2B(+)を0x20(SP)に置換する。

    5. nameStringvalueStringを、それぞれnamevalueUTF-8 BOM無しデコードパーセントデコードの結果)で得たものとする。

    6. appendで(nameString, valueString)をoutputに追加。

  4. outputを返す。

5.2. application/x-www-form-urlencoded の直列化

application/x-www-form-urlencoded直列化器は、name-valueタプルのリストtuplesと、省略可能なencoding encoding(デフォルトはUTF-8)を受け取り、以下の手順を実行します。返り値はASCII文字列です。

  1. encodingget an output encodingから得た結果にセットする。

  2. outputを空文字列にセットする。

  3. tuplesの各tupleについて:

    1. Asserttupleのnameとvalueはスカラー値文字列である。

    2. namepercent-encode after encodingencoding, tupleのname, application/x-www-form-urlencoded percent-encode set, true)で得たものとする。

    3. valuepercent-encode after encodingencoding, tupleのvalue, application/x-www-form-urlencoded percent-encode set, true)で得たものとする。

    4. outputが空文字列でなければ、U+0026(&)をoutputに追加。

    5. name、U+003D(=)、valueの順でoutputに追加。

  4. outputを返す。

5.3. フック

application/x-www-form-urlencoded文字列パーサは、スカラー値文字列inputUTF-8エンコードし、その結果をapplication/x-www-form-urlencodedパースに渡します。

6. API

この節ではWeb IDLの用語を使用します。ブラウザのユーザーエージェントはこのAPIをサポートしなければなりません。JavaScriptの実装もこのAPIをサポートするべきです。他のユーザーエージェントやプログラミング言語は、自身のニーズに合わせたAPIを利用することが推奨されますが、それが必ずしもこのAPIである必要はありません。[WEBIDL]

6.1. URLクラス

[Exposed=*,
 LegacyWindowAlias=webkitURL]
interface URL {
  constructor(USVString url, optional USVString base);

  static URL? parse(USVString url, optional USVString base);
  static boolean canParse(USVString url, optional USVString base);

  stringifier attribute USVString href;
  readonly attribute USVString origin;
           attribute USVString protocol;
           attribute USVString username;
           attribute USVString password;
           attribute USVString host;
           attribute USVString hostname;
           attribute USVString port;
           attribute USVString pathname;
           attribute USVString search;
  [SameObject] readonly attribute URLSearchParams searchParams;
           attribute USVString hash;

  USVString toJSON();
};

URLオブジェクトには、以下が関連付けられています:

API URLパーサは、スカラー値文字列urlと、オプションでnullまたはスカラー値文字列base(デフォルトはnull)を受け取り、以下の手順を実行します:

  1. parsedBaseをnullにする。

  2. baseがnullでなければ:

    1. parsedBase基本URLパーサbaseをパースした結果をセット。

    2. parsedBaseが失敗なら失敗を返す。

  3. 基本URLパーサurlparsedBaseをパースした結果を返す。

initializeで、URLオブジェクト urlURL urlRecordで初期化する場合:

  1. queryurlRecordquery(nullでなければ)または空文字列とする。

  2. urlURLurlRecordをセット。

  3. urlquery objectに新しいURLSearchParams オブジェクトをセットする。

  4. Initializeurlquery objectqueryを渡す。

  5. urlquery objectURL objecturlをセット。


new URL(url, base) コンストラクタの手順:

  1. parsedURLAPI URLパーサurlbase(もし指定されていれば)をパースした結果とする。

  2. parsedURLが失敗なら、TypeError例外をスローする。

  3. InitializethisparsedURLで初期化する。

パースURLに文字列を変換する際、base URLなしでURLコンストラクタを1つの引数で呼び出せます:

var input = "https://example.org/💩",
    url = new URL(input)
url.pathname // "/%F0%9F%92%A9"

入力が相対URL文字列の場合は例外がスローされます:

try {
  var url = new URL("/🍣🍺")
} catch(e) {
  // that happened
}

この場合はbase URLが必要です:

var input = "/🍣🍺",
    url = new URL(input, document.baseURI)
url.href // "https://url.spec.whatwg.org/%F0%9F%8D%A3%F0%9F%8D%BA"

URLオブジェクトはbase URLとしても利用可能です(IDLは文字列引数のみ許容するため、URLオブジェクトはhrefの値に変換されます):

var url = new URL("🏳️‍🌈", new URL("https://pride.example/hello-world"))
url.pathname // "/%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88"

static parse(url, base) メソッドの手順:

  1. parsedURLAPI URLパーサurlbase(もし指定されていれば)をパースした結果とする。

  2. parsedURLが失敗ならnullを返す。

  3. urlを新しいURLオブジェクトとして作成。

  4. InitializeurlparsedURLで初期化。

  5. urlを返す。

static canParse(url, base) メソッドの手順:

  1. parsedURLAPI URLパーサurlbase(もし指定されていれば)をパースした結果とする。

  2. parsedURLが失敗ならfalseを返す。

  3. trueを返す。


hrefゲッターおよびtoJSON()メソッドは、thisのURLの直列化結果を返します。

href セッターの手順:

  1. parsedURL基本URLパーサで与えられた値をパースした結果とする。

  2. parsedURLが失敗なら、TypeError例外をスローする。

  3. thisURLparsedURLをセットする。

  4. thisquery objectlistを空にする。

  5. querythisURLqueryとする。

  6. queryがnullでなければ、thisquery objectlistqueryパースした結果をセットする。

originゲッターは、thisのURLのoriginの直列化結果を返します。[HTML]

protocolゲッターは、thisURLschemeにU+003A(:)を連結したものを返します。

protocol セッターは、与えられた値にU+003A(:)を連結し、基本URLパースを実行し、thisURLurlscheme start statestate overrideとして使う。

usernameゲッターは、thisURLusernameを返します。

username セッターは以下の手順を実行します:

  1. thisURLusername/password/portを持てない場合はreturn。

  2. Set the usernameで、thisURLと与えられた値を使う。

passwordゲッターは、thisURLpasswordを返します。

password セッターの手順:

  1. thisURLusername/password/portを持てないならreturn。

  2. Set the passwordで、thisURLと与えられた値を使う。

hostゲッターの手順:

  1. urlthisURLとする。

  2. urlhostがnullなら空文字列を返す。

  3. urlportがnullなら、urlhost直列化済み)を返す。

  4. urlhost直列化済み)にU+003A(:)とurlport直列化済み)を連結して返す。

host セッターの手順:

  1. thisURL不透明パスを持つならreturn。

  2. Basic URL parseで、与えられた値をthisURLurl)とhost statestate override)でパースする。

この host セッターに与えられた値にportがなければ、 thisURLportは変更されません。getterではURL-port stringで返るため、setterが両方を常に「リセット」すると思うかもしれませんが、そうではありません。

hostnameゲッターの手順:

  1. thisURLhostがnullなら空文字列を返す。

  2. thisURLhost直列化済み)を返す。

hostname セッターの手順:

  1. thisURL不透明パスを持つならreturn。

  2. Basic URL parseで、与えられた値をthisURLurl)とhostname statestate override)でパースする。

portゲッターの手順:

  1. thisURLportがnullなら空文字列を返す。

  2. thisURLport直列化済み)を返す。

port セッターの手順:

  1. thisURLusername/password/portを持てないならreturn。

  2. 与えられた値が空文字列なら、thisURLportをnullにセットする。

  3. それ以外の場合、Basic URL parseで、与えられた値をthisURLurl)とport statestate override)でパースする。

pathnameゲッターの手順:URLパス直列化thisURLを直列化した結果を返す。

pathname セッターの手順:

  1. thisURL不透明パスを持つならreturn。

  2. EmptythisURLpathを空にする。

  3. Basic URL parseで、与えられた値をthisURLurl)とpath start statestate override)でパースする。

searchゲッターの手順:

  1. thisURLqueryがnullまたは空文字列なら空文字列を返す。

  2. U+003F(?)とthisURLqueryを連結して返す。

search セッターの手順:

  1. urlthisURLとする。

  2. 与えられた値が空文字列なら、urlqueryをnullにし、Emptythisquery objectlistを空にし、return。

  3. inputを与えられた値から先頭のU+003F(?)を1つ除いたものとする(もしあれば)。

  4. urlqueryを空文字列にセットする。

  5. Basic URL parseinputurlurl)とquery statestate override)でパースする。

  6. thisquery objectlistinputパースした結果をセットする。

searchParamsゲッターの手順:thisquery objectを返す。

hashゲッターの手順:

  1. thisURLfragmentがnullまたは空文字列なら空文字列を返す。

  2. U+0023(#)とthisURLfragmentを連結して返す。

hash セッターの手順:

  1. 与えられた値が空文字列なら、thisURLfragmentをnullにし、return。

  2. inputを与えられた値から先頭のU+0023(#)を1つ除いたものとする(もしあれば)。

  3. thisURLfragmentを空文字列にセットする。

  4. Basic URL parseinputthisURLurl)とfragment statestate override)でパースする。

6.2. URLSearchParamsクラス

[Exposed=*]
interface URLSearchParams {
  constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");

  readonly attribute unsigned long size;

  undefined append(USVString name, USVString value);
  undefined delete(USVString name, optional USVString value);
  USVString? get(USVString name);
  sequence<USVString> getAll(USVString name);
  boolean has(USVString name, optional USVString value);
  undefined set(USVString name, USVString value);

  undefined sort();

  iterable<USVString, USVString>;
  stringifier;
};

URLSearchParams オブジェクトの構築と文字列化は非常に簡単です:

let params = new URLSearchParams({key: "730d67"})
params.toString() // "key=730d67"

URLSearchParams オブジェクトはapplication/x-www-form-urlencoded 形式を内部で利用するため、URLオブジェクト (hrefsearchを含む)と比較して、一部のコードポイントのエンコード方法が異なる場合があります。 特にsearchParamsURLqueryを操作する場合、驚くことがあります。

const url = new URL('https://example.com/?a=b ~');
console.log(url.href);   // "https://example.com/?a=b%20~"
url.searchParams.sort();
console.log(url.href);   // "https://example.com/?a=b+%7E"
const url = new URL('https://example.com/?a=~&b=%7E');
console.log(url.search);                // "?a=~&b=%7E"
console.log(url.searchParams.get('a')); // "~"
console.log(url.searchParams.get('b')); // "~"

URLSearchParams オブジェクトはapplication/x-www-form-urlencoded percent-encode setに含まれるものをパーセントエンコードし、U+0020(スペース)はU+002B(+)としてエンコードします。

エンコーディングを無視する場合(UTF-8を使用)、searchは、query percent-encode setまたはspecial-query percent-encode setURL特殊かどうかによる)に含まれるものをパーセントエンコードします。

URLSearchParams オブジェクトには以下が関連付けられています:

URLSearchParams オブジェクトqueryinit初期化するには:

  1. initsequenceなら、innerSequenceについて:

    1. innerSequencesizeが2でなければ、TypeError例外をスローする。

    2. AppendinnerSequence[0], innerSequence[1])をquerylistに追加する。

  2. それ以外でinitrecordなら、namevalueについて、appendname, value)をquerylistに追加する。

  3. それ以外の場合:

    1. Assert: initは文字列である。

    2. querylistパースしたinitの結果をセットする。

URLSearchParams オブジェクトqueryupdateするには:

  1. queryURL objectがnullならreturn。

  2. serializedQueryquerylist直列化結果とする。

  3. serializedQueryが空文字列ならserializedQueryをnullにする。

  4. queryURL objectURLqueryserializedQueryをセットする。

new URLSearchParams(init) コンストラクタの手順:

  1. initが文字列かつU+003F(?)で始まる場合、最初のコードポイントをinitから削除する。

  2. Initializethisinitで初期化する。

sizeゲッターはthislistsizeを返します。

append(name, value) メソッドの手順:

  1. Appendname, value)をthislistに追加する。

  2. Updatethisを更新する。

delete(name, value) メソッドの手順:

  1. valueが指定されている場合、removetuples(nameがnameかつvalueがvalue)をthislistから削除する。

  2. それ以外は、removeでnameがnametuplesthislistから削除する。

  3. Updatethisを更新する。

get(name)メソッドの手順:thislist内でnameがnameである最初のtupleのvalueを返す。なければnull。

getAll(name) メソッドの手順:thislist内でnameがnameである全てのtupleのvalueをリスト順で返す。なければ空のsequence。

has(name, value) メソッドの手順:

  1. valueが指定されていて、tuple(nameがnameかつvalueがvalue)がthislistに存在すればtrueを返す。

  2. valueが指定されていなくて、nameがnametuplethislistに存在すればtrueを返す。

  3. falseを返す。

set(name, value) メソッドの手順:

  1. thislistnametuplesを含む場合、最初のtupleのvalueをvalueにセットし、他のものをremoveする。

  2. それ以外の場合、appendname, value)をthislistに追加する。

  3. Updatethisを更新する。


URLSearchParams オブジェクト内のname-valueタプルをソートするのは便利で、特にキャッシュヒット率向上に役立ちます。これはsort() メソッドで実現できます:

const url = new URL("https://example.org/?q=🏳️‍🌈&key=e1f7bc78");
url.searchParams.sort();
url.search; // "?key=e1f7bc78&q=%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88"

元の入力を変更したくない場合(例えば比較目的など)、新しいURLSearchParams オブジェクトを作成してください:

const sorted = new URLSearchParams(url.search)
sorted.sort()

sort()メソッドの手順:

  1. thislistを、昇順でソートしたthislistに置き換える。aのnameがbのnameよりコード単位で小さい場合、abより小さいとする。

  2. Updatethisを更新する。


反復するvalue pairsは、thislisttuples(keyがname、valueがvalue)です。

文字列化挙動の手順:thisのlistを直列化した結果を返す。

6.3. 他の場所のURL API

標準がURLを公開する場合、 内部のURL直列化して文字列として公開するべきです。標準はURLオブジェクトを使ってURLを公開すべきではありません。URLオブジェクトはURL操作のためのものです。IDLではUSVString型を使うべきです。

ここでのより高次の概念は、値を不変なデータ構造として公開することです。

標準が自身で定義する機能名に「URL」のバリエーションを使う場合、その機能名は「url」(小文字かつ末尾が「l」)とするべきです。「URL」「URI」「IRI」といった名前は使うべきではありません。ただし、複合語の場合は「URL」(大文字)が推奨されます。例: "newURL", "oldURL"。

EventSourceHashChangeEventインターフェース(HTML)は適切な命名例です。[HTML]

謝辞

長年にわたりURLの相互運用性向上に貢献し、この標準の目標達成に寄与してきた多くの方々に感謝します。同様に、この標準が現在の形になったのにも多くの方々が貢献しています。

改めて、感謝を述べます: 100の人, Adam Barth, Addison Phillips, Adrián Chaves, Adrien Ricciardi, Albert Wiersch, Alex Christensen, Alexis Hunt, Alexandre Morgaut, Alexis Hunt, Alwin Blok, Andrew Sullivan, Arkadiusz Michalski, Behnam Esfahbod, Bobby Holley, Boris Zbarsky, Brad Hill, Brandon Ross, Cailyn Hansen, Chris Dumez, Chris Rebert, Corey Farwell, Dan Appelquist, Daniel Bratell, Daniel Stenberg, David Burns, David Håsäther, David Sheets, David Singer, David Walp, Domenic Denicola, Emily Schechter, Emily Stark, Eric Lawrence, Erik Arvidsson, Gavin Carothers, Geoff Richards, Glenn Maynard, Gordon P. Hemsley, hemanth, Henri Sivonen, Ian Hickson, Ilya Grigorik, Italo A. Casas, Jakub Gieryluk, James Graham, James Manger, James Ross, Jeff Hodges, Jeffrey Posnick, Jeffrey Yasskin, Joe Duarte, Joshua Bell, Jxck, Karl Wagner, Kemal Zebari, 田村健人 (Kent TAMURA), Kevin Grandon, Kornel Lesiński, Larry Masinter, Leif Halvard Silli, Mark Amery, Mark Davis, Marcos Cáceres, Marijn Kruisselbrink, Martin Dürst, Mathias Bynens, Matt Falkenhagen, Matt Giuca, Michael Peick, Michael™ Smith, Michal Bukovský, Michel Suignard, Mikaël Geljić, Noah Levitt, Peter Occil, Philip Jägenstedt, Philippe Ombredanne, Prayag Verma, Rimas Misevičius, Robert Kieffer, Rodney Rehm, Roy Fielding, Ryan Sleevi, Sam Ruby, Sam Sneddon, Santiago M. Mola, Sebastian Mayr, Shannon Booth, Simon Pieters, Simon Sapin, Steven Vachon, Stuart Cook, Sven Uhlig, Tab Atkins, 吉野剛史 (Takeshi Yoshino), Tantek Çelik, Tiancheng "Timothy" Gu, Tim Berners-Lee, 簡冠庭 (Tim Guan-tin Chien), Titi_Alone, Tomek Wytrębowicz, Trevor Rowbotham, Tristan Seligmann, Valentin Gosu, Vyacheslav Matva, Wei Wang, Wolf Lammen, 山岸和利 (Yamagishi Kazutoshi), Yongsheng Zhang, 成瀬ゆい (Yui Naruse), and zealousidealroll 皆様ありがとうございます!

この標準はAnne van KesterenApple, annevk@annevk.nl)によって執筆されています。

知的財産権

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この作品は クリエイティブ・コモンズ 表示 4.0 国際ライセンス の下で提供されています。ソースコードに組み込まれている部分については、BSD 3-Clause ライセンス の下で提供されます。

これは現行標準です。 特許レビュー版に関心がある方は現行標準レビュー草案をご覧ください。

索引

本仕様で定義されている用語

参照によって定義される用語

参考文献

規定参考文献

[BIDI]
Manish Goregaokar マニシュ・ゴレガオンカル; Robin Leroy. Unicode Bidirectional Algorithm. 2024年9月2日. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-50.html
[ENCODING]
Anne van Kesteren. Encoding Standard. 現行標準. URL: https://encoding.spec.whatwg.org/
[FILEAPI]
Marijn Kruisselbrink. File API. URL: https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren; 他. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[IANA-URI-SCHEMES]
Uniform Resource Identifier (URI) Schemes. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[PSL]
Public Suffix List. Mozilla Foundation.
[RFC4291]
R. Hinden; S. Deering. IP Version 6 Addressing Architecture. 2006年2月. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc4291
[UTS46]
Mark Davis; Markus Scherer. Unicode IDNA Compatibility Processing. 2024年8月30日. Unicode Technical Standard #46. URL: https://www.unicode.org/reports/tr46/tr46-33.html
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/

参考情報文献

[ECMA-262]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[IDNFAQ]
Internationalized Domain Names (IDN) FAQ. URL: https://unicode.org/faq/idn.html
[RFC1034]
P. Mockapetris. Domain names - concepts and facilities. 1987年11月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc1034
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. Uniform Resource Identifier (URI): Generic Syntax. 2005年1月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc3986
[RFC3987]
M. Duerst; M. Suignard. Internationalized Resource Identifiers (IRIs). 2005年1月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc3987
[RFC5890]
J. Klensin. Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework. 2010年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5890
[RFC5952]
S. Kawamura; M. Kawashima. A Recommendation for IPv6 Address Text Representation. 2010年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5952
[RFC6454]
A. Barth. The Web Origin Concept. 2011年12月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6454
[RFC7595]
D. Thaler, Ed.; T. Hansen; T. Hardie. Guidelines and Registration Procedures for URI Schemes. 2015年6月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc7595
[RFC791]
J. Postel. Internet Protocol. 1981年9月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc791
[UTR36]
Mark Davis; Michel Suignard. Unicode Security Considerations. 2014年9月19日. Unicode Technical Report #36. URL: https://www.unicode.org/reports/tr36/tr36-15.html
[UTS39]
Mark Davis; Michel Suignard. Unicode Security Mechanisms. 2024年9月3日. Unicode Technical Standard #39. URL: https://www.unicode.org/reports/tr39/tr39-30.html

IDL索引

[Exposed=*,
 LegacyWindowAlias=webkitURL]
interface URL {
  constructor(USVString url, optional USVString base);

  static URL? parse(USVString url, optional USVString base);
  static boolean canParse(USVString url, optional USVString base);

  stringifier attribute USVString href;
  readonly attribute USVString origin;
           attribute USVString protocol;
           attribute USVString username;
           attribute USVString password;
           attribute USVString host;
           attribute USVString hostname;
           attribute USVString port;
           attribute USVString pathname;
           attribute USVString search;
  [SameObject] readonly attribute URLSearchParams searchParams;
           attribute USVString hash;

  USVString toJSON();
};

[Exposed=*]
interface URLSearchParams {
  constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");

  readonly attribute unsigned long size;

  undefined append(USVString name, USVString value);
  undefined delete(USVString name, optional USVString value);
  USVString? get(USVString name);
  sequence<USVString> getAll(USVString name);
  boolean has(USVString name, optional USVString value);
  undefined set(USVString name, USVString value);

  undefined sort();

  iterable<USVString, USVString>;
  stringifier;
};

MDN

URL/URL

In all current engines.

Firefox26+Safari14.1+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js10.0.0+
MDN

URL/canParse_static

Firefox115+Safari17+ChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js20.0.0+
MDN

URL/hash

In all current engines.

Firefox22+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/host

In all current engines.

Firefox22+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/hostname

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/href

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/origin

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
MDN

URL/password

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
MDN

URL/pathname

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/port

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/protocol

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/search

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
MDN

URL/searchParams

In all current engines.

Firefox29+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URL/toJSON

In all current engines.

Firefox54+Safari11+Chrome71+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.7.0+
MDN

URL/toString

In all current engines.

Firefox54+Safari7+Chrome19+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
MDN

URL/username

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
MDN

URL

In all current engines.

Firefox19+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile?
Node.js10.0.0+
MDN

URLSearchParams/URLSearchParams

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/entries

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/forEach

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/keys

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/values

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/append

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/delete

In all current engines.

Firefox29+Safari14+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/get

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/getAll

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/has

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/set

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams/size

In all current engines.

Firefox112+Safari17+Chrome113+
Opera?Edge113+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js19.0.0+
MDN

URLSearchParams/sort

In all current engines.

Firefox54+Safari11+Chrome61+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.7.0+
MDN

URLSearchParams/toString

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
MDN

URLSearchParams

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js10.0.0+