Uniform Resource Identifier

Uniform Resource Identifierまたは統一資源識別子とは、抽象的または物理的なリソースを識別するためのコンパクトな文字列のことである。また、一定の書式によってリソースを指し示す識別子である。1998年8月に RFC 2396 として規定され、2005年1月に RFC 3986 として改定された。URI はUniform Resource Locator  の考え方を拡張したものである。URIによって示されるリソースは限定されておらず、インターネット上に存在しない対象や抽象的な概念を示す場合もある。

1. 設計
-----

1.1. URL と URN
--------------

URI には、以下の2つのサブセットがある。

Uniform Resource Locator リソースの「場所」を識別する。ネットワーク内の位置を示してリソースを同定する。Uniform Resource Name リソースの「名前」を識別する。もしネットワーク上にリソースが無くなっても、一意で永続的な識別を行えるようにする。例えば というURNは、への参照を示す。2001年、W3CはRFC 3305内で、上記の考え方を古典的な見解とした。ここで示されたW3Cの新たな考え方により、従来のURLとURNとはすべてURIと呼ばれることになった。URLやURNといった語はW3Cによって非公式な表現とされた。

2012年、WHATWGによって[1]の開発が開始された。URL Standardでは、目標の1つとしてRFC 3986 とRFC 3987 を過去のものにすることを掲げている。また、従来のURIやIRIを区別する必要が無いとして、すべてURLの語を用いている。さらに、W3Cでも、このURL Standardのスナップショットをワーキンググループノートとして公開している。

1.2. 共通構文
---------

以下のURI共通構文はすべてのスキーム構文で扱うスーパーセットの定義である。なおこの節では2005年1月に発表された RFC 3986 を主に出典とする。

URIの長さは 、URL Standard共に255文字までと定められているが、URL Standardでは「有効なIPv4アドレス」が付け加えられている。

構文図と各コンポーネントの解説は次の通り。

scheme URIはこの「スキーム」と呼ばれる識別子から始まり、省略できない。階層的識別子である:はスキームの区切り文字でスキーム名の最後に挿入する。
スキーム名は文字で始まり、文字、数字、+、-、.で構成される文字列となる。大文字と小文字を区別しないが、一貫性を保つために小文字の使用を推奨している。 authority 権限は//の区切り文字から始まる。userinfoやhostの扱いは各スキームよって異なる。
URIの考案者であるティム・バーナーズ＝リーは2009年10月12日、ニューヨーク・タイムズにて権限の区切り文字であるダブルスラッシュについて「必要では無い事が判明した」と述べている。 path URIに権限が含まれている場合、パスに文字が無くても/で始める必要があり、この事からパスを省略することはできない。権限が含まれていない場合は//で始めることはできない。さらに相対パスである場合は:から始めることはできない。パスに?、#を含む、あるいは末尾の場合、パスの終わりを示す。階層的に構成されたデータが含まれ、階層は/で区切る。 query クエリは?の区切り文字から始まり、#また末尾で終える。パスと違い、階層的なデータを含まない。、第3章4節において明確的な構文は示されてない。 fragment フラグメントは#の区切り文字から始まる。任意な扱いで、プライマリリソースを参照し、セカンダリリソースへ提供するフラグメント識別子を含む。クエリと同様に明確的な構文は示されてない。
一例としてプライマリリソースがHTMLドキュメントの場合、要素のid属性に何かしらの値を指定し、フラグメントにも同様の値を指定することで、ウェブブラウザは表示の際にその要素の位置までスクロールする。ウィキペディアでは「アンカー」と呼ばれる機能が該当する。
電話番号、電子メールアドレスは RFC 3191 及び RFC 3192 で定義されている構文を利用する。

1.3. 予約文字とパーセントエンコーディング
-----------------------

上記で列挙した文字は、URI共通構文で区切りとして予約された文字である為、コンポーネント内で直接使用することはできない。なお[と]はIPv6の区切り文字である。sub-delimsはURIスキームの仕様によって定義されることがある。

パーセントエンコーディングは上記で列挙した予約文字などをURIで使えるよう、別の形式に変換する。名前のとおり、パーセント記号%とオクテットを16進数で表現した文字を組み合わせた形式で表す。例えばスペース文字 をパーセントエンコーディングすると%20に変換される。

予約されていない文字には制約無く、コンポーネント内で自由に使える文字。予約されていない文字は次の通り。

英字 ： AからZ、そしてaからz
数字 ： 0から9
一部の記号 ： -、.、_、~なおチルダ~は古いURIの仕様によってしばしば%7eに変換される事がある。しかしてチルダ含め、予約されていない文字の変換は必要無い。

1.4. http/httpsスキームの構文例
-----------------------

http/httpsスキームの構文を使った例：

#共通構文と同じコンポーネントの解説は除く。

userinfoはホスト:ポートよりも先に記載する必要がある。開始の区切り文字は無く、@で区切る事でユーザー情報の終わりを示す。ユーザー情報の形式はuser:passwordである。URIにユーザー情報が付加され、かつその情報が正しければウェブブラウザは認証ダイアログを表示せずプライベートページを表示させることができる。認証情報を平文で示す為、パスワードを含んだ認証情報は非推奨である。これはURL Standardでも同様である。

hostはhttp/httpsスキームにおいて必要な権限であり、省略することはできない。portはスキームのデフォルトポートであれば省略できる。

クエリはパスに対しての引数であるがその構文は明確的に示されてない。一般的な利用法は、「名前」と「値」の組み合わせで扱われ、構文にするとkey=valueとなり、「名前」と「値」の間は=で結ぶ。このペアが複数存在する場合、上記構文例のように&で繋げる。クエリはWebサーバ及びクライアント側で処理できる。URL StandardではJavaScript上でクエリ文字列を簡単に扱えるようURLSearchParamsメソッドが実装されている。

フラグメントはクライアントのみ影響する。URIを決定する際、アプリケーションはフラグメントを除外してからサーバーにリクエストを送る。

1.5. 公式登録のスキーム
--------------

IANAに登録されているスキームで、利用が続いている一部を掲載する。



1.6. 一般的な非登録のスキーム
-----------------

javascript ウェブブラウザやHTMLドキュメントでJavaScriptを実行する手段として用いられている。ドラフト状態であったが2011年3月29日に期限切れを迎えた。

2. 関連項目
-------

Extensible Resource Identifier 
Internationalized Resource Identifier 
短縮URI 
Uniform Resource Locator 
Uniform Resource Name 
名前空間
パーセントエンコーディング

3. 脚注
-----

4. 参考資料
-------

2396}} - Uniform Resource Identifiers : Generic Syntax 
[2] - 統一資源識別子 共通構文 標準仕様書
3986}} - Uniform Resource Identifier : Generic Syntax
8820}} - URI Design and Ownership
[3]
[4]
[5]
[6] - IANAのURIスキーム登録簿