メインコンテンツまでスキップ

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 / "+" / "-" / "." )

:

  • http
  • https
  • ftp
  • mailto
  • file
  • data
  • tel

スキーム名は大文字小文字を区別しません。正規形式は小文字であり、ノーマライザーはスキーム名を小文字に変換すべきです (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@host
  • user: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

重要な特性:

  1. クライアント側処理: フラグメント識別子はクライアントによって処理され、サーバーには送信されません
  2. ドキュメント内ナビゲーション: HTML文書のアンカーによく使用されます
  3. 二次リソース: 主リソースの一部を識別します

:

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
コンポーネント
schemehttps
userinfouser:pass
hostwww.example.com
port8080
path/path/to/page
querykey=value
fragmentsection

例2: Mailto URI

mailto:[email protected]?subject=Hello
コンポーネント
schememailto
path[email protected]
querysubject=Hello

例3: File URI

file:///home/user/document.txt
コンポーネント
schemefile
authority(空)
path/home/user/document.txt

コンポーネントエンコーディング規則

異なるコンポーネントは異なる文字セットを許可します:

コンポーネント許可される特殊文字エンコードが必要
scheme+ - .その他すべて
userinfo: ! $ & ' ( ) * + , ; =その他すべて
host- . _ (reg-name)その他すべて
port0-9その他すべて
path: @ ! $ & ' ( ) * + , ; =その他すべて
query: @ / ? ! $ & ' ( ) * + , ; =その他すべて
fragment: @ / ? ! $ & ' ( ) * + , ; =その他すべて

次の章: 4. URI参照 (URI Reference) - URI参照と相対参照