3. 構文コンポーネント (Syntax Components)
URIの汎用構文は、スキーム (scheme)、オーソリティ (authority)、パス (path)、クエリ (query)、フラグメント (fragment) と呼ばれる階層的なコンポーネントシーケンスで構成されます。
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
コンポーネント構造の例:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
以下の各セクションでは、各コンポーネントの詳細な説明を提供します。
3.1. スキーム (Scheme)
各URIは、そのスキーム内で識別子を割り当てるための仕様を参照するスキーム名で始まります。スキーム名は、文字で始まり、その後に文字、数字、プラス ("+")、ピリオド (".")、またはハイフン ("-") の任意の組み合わせが続く文字列です。
scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
例:
httphttpsftpmailtofiledatatel
スキーム名は大文字小文字を区別しません。正規形式は小文字であり、ノーマライザーはスキーム名を小文字に変換すべきです (SHOULD)。
注意: スキームは大文字小文字を区別しませんが、プロデューサーとノーマライザーは小文字を使用すべきです (SHOULD)。
3.2. オーソリティ (Authority)
オーソリティコンポーネントは、オプションのユーザー情報サブコンポーネント、ホストサブコンポーネント、およびオプションのポートサブコンポーネントで構成され、2つのスラッシュ ("//") が前に付きます。
authority = [ userinfo "@" ] host [ ":" port ]
完全な例:
user:[email protected]:8080
\__________/ \______________/ \__/
userinfo host port
3.2.1. ユーザー情報 (User Information)
userinfoサブコンポーネントは、ユーザー名と、オプションで、リソースへのアクセス権限を取得する方法に関するスキーム固有の情報で構成される場合があります。
userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
例:
user@hostuser:password@host(非推奨、セキュリティリスク)anonymous@host
セキュリティ警告: URIにパスワードを含めることは非推奨です。パスワードがログ、履歴などで公開される可能性があるためです。
3.2.2. ホスト (Host)
hostサブコンポーネントは、登録名 (ホスト名を含むがこれに限定されない) またはIPアドレスにすることができます。IPv6アドレスは角括弧で囲む必要があります (MUST)。
host = IP-literal / IPv4address / reg-name
IP-literal = "[" ( IPv6address / IPvFuture ) "]"
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
reg-name = *( unreserved / pct-encoded / sub-delims )
ホストタイプの例:
1. 登録名
www.example.com
example.org
localhost
2. IPv4アドレス
192.0.2.1
127.0.0.1
3. IPv6アドレス
[2001:db8::1]
[::1]
[fe80::1]
4. 将来のIPバージョン
[v9.abc:def]
ホスト正規化: ホスト名は大文字小文字を区別せず、小文字に正規化すべきです (SHOULD)。
3.2.3. ポート (Port)
portサブコンポーネントはオプションであり、10進数字で表されます。
port = *DIGIT
例:
http://example.com:80/(HTTPデフォルトポート)https://example.com:443/(HTTPSデフォルトポート)http://example.com:8080/(カスタムポート)
デフォルトポート: ポートが空または指定されていない場合、スキームのデフォルトポートであると想定されます。
3.3. パス (Path)
pathコンポーネントには、クエリコンポーネントのデータとともに、URIのスキームと命名オーソリティのスコープ内でリソースを識別するために使用されるデータが含まれています。パスは、スラッシュ ("/") 文字で区切られた一連のパスセグメントで構成されます。
path = path-abempty ; "/" で始まるか空
/ path-absolute ; "/" で始まるが "//" ではない
/ path-noscheme ; コロン以外のセグメントで始まる
/ path-rootless ; セグメントで始まる
/ path-empty ; ゼロ文字
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty = 0<pchar>
segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
パスタイプの例:
1. 絶対パス
/path/to/resource
/index.html
/
2. 相対パス
path/to/resource
../parent/resource
resource
3. 空パス
http://example.com
パスセグメント: パスはスラッシュで区切られたセグメントで構成されます。特殊なセグメントには次のものがあります:
.(現在のディレクトリ)..(親ディレクトリ)
3.4. クエリ (Query)
queryコンポーネントには、pathコンポーネントのデータとともに、リソースを識別するために使用される非階層的なデータが含まれています。クエリコンポーネントは疑問符 ("?") で示されます。
query = *( pchar / "/" / "?" )
クエリ文字列の例:
?key=value
?name=John&age=30
?search=hello+world
?filter[]=a&filter[]=b
?q=%E4%BD%A0%E5%A5%BD
一般的な形式: URI仕様ではクエリ文字列の形式を定義していませんが、&で区切られたkey=valueペアの形式が事実上の標準となっています:
?key1=value1&key2=value2&key3=value3
3.5. フラグメント (Fragment)
fragmentコンポーネントは、URIによって識別されるリソースの表現内の二次リソースの間接的な識別を可能にします。フラグメント識別子はハッシュ記号 ("#") で示されます。
fragment = *( pchar / "/" / "?" )
フラグメントの例:
#section1
#top
#chapter-3
#line-42
重要な特性:
- クライアント側処理: フラグメント識別子はクライアントによって処理され、サーバーには送信されません
- ドキュメント内ナビゲーション: HTML文書のアンカーによく使用されます
- 二次リソース: 主リソースの一部を識別します
例:
http://example.com/page.html#section2
- サーバーが受信:
http://example.com/page.html - クライアントがナビゲート:
#section2
URIコンポーネントの要約
| コンポーネント | プレフィックス | 必須 | 例 | 説明 |
|---|---|---|---|---|
| scheme | - | はい | http | プロトコル/スキーム |
| authority | // | いいえ | user@host:port | オーソリティ情報 |
| path | - | はい* | /path/to/resource | リソースパス |
| query | ? | いいえ | key=value | クエリパラメータ |
| fragment | # | いいえ | section1 | フラグメント識別子 |
*パスは空でもよい
完全なURI例の分解
例1: HTTP URL
https://user:[email protected]:8080/path/to/page?key=value#section
| コンポーネント | 値 |
|---|---|
| scheme | https |
| userinfo | user:pass |
| host | www.example.com |
| port | 8080 |
| path | /path/to/page |
| query | key=value |
| fragment | section |
例2: Mailto URI
mailto:[email protected]?subject=Hello
| コンポーネント | 値 |
|---|---|
| scheme | mailto |
| path | [email protected] |
| query | subject=Hello |
例3: File URI
file:///home/user/document.txt
| コンポーネント | 値 |
|---|---|
| scheme | file |
| authority | (空) |
| path | /home/user/document.txt |
コンポーネントエンコーディング規則
異なるコンポーネントは異なる文字セットを許可します:
| コンポーネント | 許可される特殊文字 | エンコードが必要 |
|---|---|---|
| scheme | + - . | その他すべて |
| userinfo | : ! $ & ' ( ) * + , ; = | その他すべて |
| host | - . _ (reg-name) | その他すべて |
| port | 0-9 | その他すべて |
| path | : @ ! $ & ' ( ) * + , ; = | その他すべて |
| query | : @ / ? ! $ & ' ( ) * + , ; = | その他すべて |
| fragment | : @ / ? ! $ & ' ( ) * + , ; = | その他すべて |
次の章: 4. URI参照 (URI Reference) - URI参照と相対参照