Uniform Resource Identifier

Uniform Resource Identifier（ユニフォーム リソース アイデンティファイア、URI）とは、抽象的または物理的なリソースを識別するためのコンパクトな文字列のことである。また、一定の書式によってリソース（資源）を指し示す識別子である。統一資源識別子（とういつしげんしきべつし）とも 9頁。

1998年8月に  として規定され、2005年1月に  として改定された。URI はUniform Resource Locator (URL) の考え方を拡張したものである。URIによって示されるリソースは限定されておらず、インターネット上に存在しない対象や抽象的な概念を示す場合もある。

 設計 
 URL と URN 
URI には、以下の2つのサブセットがある。
Uniform Resource Locator (URL)
リソースの「場所」を識別する。ネットワーク内の位置を示してリソースを同定する。
Uniform Resource Name (URN)
リソースの「名前」を識別する。もしネットワーク上にリソースがなくなっても、一意で永続的な識別を行えるようにする。例えば urn:ietf:rfc:2648 というURNは、RFC 2648への参照を示す。

2001年、W3Cは - URIs, URLs, and URNs: Clarifications and Recommendations 1.0内で、上記の考え方を古典的な見解とした。以降、従来のURLとURNとはすべて「URI」と呼ばれることになり、URLやURNといった語はW3Cによって非公式な表現とされた。

一方、2012年、WHATWGによって開始されたURL Standard（URLを標準化を目指す規格書）では、URIの概念を表す語に「URL」を用いている。規格書では、語「URL」を標準化した理由を二つ挙げている。一つ、URIとIRIは混同されやすく、いずれも同じアルゴリズムを用いている。そのため、それらを区別する利点がない。二つ、Google Trends（2025年時点）で「URI」と「URL」の二つの語を比較すると、「URL」の方が優位である。つまり、インターネット上では、「URL」という言葉を使用しているユーザーの方が多い。

URL Standardでは、目標の1つとして (URI) と (IRI) に代わる標準になることを掲げている。現在、唯一の標準には至っていないが、W3CのURL規格の公式ページでは、このURL Standardのスナップショットをワーキンググループノートとして公開している。

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

URI = scheme:[//authority]path[?query][#fragment]

と各コンポーネントの解説は次の通り。
なし

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

 電話番号、電子メールアドレスは  および  で定義されている構文を利用する。

 予約文字とパーセントエンコーディング 
+ 予約文字（RFC 3986 第2章2節） gen-delims : / ? # [ ] @ colspan="4"  sub-delims ! $ & ' ( ) * + , ; =

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

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

予約されていない文字（Unreserved Characters）は、制約がなく、コンポーネント内で自由に使える文字。予約されていない文字は次の通り（RFC 3986 第2章3節）。

 英字 ： AからZ、そしてaからz
 数字 ： 0から9
 一部の記号 ： -、.、_（アンダースコア）、~（チルダ）

なおチルダ~は古いURIの仕様によってしばしば%7eに変換されることがある。しかしチルダ含め、予約されていない文字の変換は本来必要ない。

 http/httpsスキームの構文例 
http/httpsスキームの構文を使った例：
 スキーム 権限 パスhttps://user:password@www.example.com:123/forum/questions/?tag=networking&order=newest#top ユーザー情報 ホスト:ポート クエリ フラグメント

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

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

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

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

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

 公式登録のスキーム 

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

+ 公式登録されているスキームのリスト スキーム 名称 仕様書・出典 構文 用途・備考 aaa     aaas     about アバウト  about://<token>[?query][#fragmen] 主にウェブブラウザの情報表示なとで用いられる。RFC 6694が定めるトークンはblankひとつのみであるが、固有機能は各トークンを参照し、処理することが推奨されている。 acap     acct     cap     cid コンテンツID（Content Identifier）  cid:<content-id> HTML形式の電子メールやMHTMLではMIMEマルチパートのコンテンツで指定されたContent-IDが存在している場合、ドキュメントからcidスキームを使うことで参照できる。例：<img src="cid:example"> coap     coap+tcp     coap+ws     coaps     coaps+tcp     coaps+ws     crid     data データURI（データURL）  data:<mediatype(;parameter)>[;base64]<,data> メディアタイプで指定されたコンテンツをデータに添付することで、HTMLドキュメントなどから参照することができる。コンテンツがプレーンテキスト以外ならBase64でエンコードする必要がある、 dav ウェブダブ（WebDAV）    dict     dns Domain Name System    example 例  example:<foo> スキーム構文例のために登録されたスキーム。RFC 7595は新しいスキームを登録する手順やガイドラインである。 file   file://[[userinfo@]<host>]</path> ホストのファイルパスを提示するスキーム。構文で示しているように、権限は認証情報が必要ない、かつローカルホストであれば省略できるため、file:///からパスが始まる。 ftp ファイル・トランスファー・プロトコル  #共通構文 参照  geo     go     gopher     h323 H.323  h323:[<user>@]<host[:port]>[;url-parameter]  httphttps ハイパーテキスト・トランスファー・プロトコル 2章7節1項および2章7節2項 #http/httpsスキームの構文例 参照  iax     icap     im     imap     info     ipp     ipps     iris     iris.beep     iris.lwz     iris.xpc     iris.xpcs     ldap     leaptofrogans     mailto     mid     msrp     msrps     mtqp     mupdate     news     nfs     ni     nih     nntp     opaquelocktoken     pkcs11     pop     pres     reload     rtsprtspurtsps リアルタイム・ストリーミング・プロトコル  rtsp://<host[:port]>/path 通常rtspとrtspsの通信プロトコルはTCPであるが、rtspuはUDPとなる。 service     session     shttp     sieve     sip     sips     sms ショートメッセージサービス  sms://<recipient[,recipient...]>[?fields]recipient = [+global-number]<local-number>  snmp     soap.beep     soap.beeps     stun     stuns     tag     tel 電話番号  tel:[+global-number]<local-number>  telnet     tftp     thismessage     tip     tn3270     turn     turns     tv     urn     vemmi     vnc     wswss WebSocket  ws://<host>[:port]<path>[?query] ポート番号のデフォルトはhttp/httpsと同様。 xcon     xcon-userid     xmlrpc.beep     xmlrpc.beeps     xmpp     z39.50r     z39.50s    

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

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

 プログラミング環境でのサポート 
いくつかのプログラミング言語や環境では、ネットワーク通信などでURIを扱う際に便利なクラスライブラリなどが標準的に用意されている。Javaではが、.NETではSystem.UriUri Class (System) | Microsoft Learnが用意されている。Androidではandroid.net.Uriクラスが用意されているUri  |  Android Developers。通例、ネットワークリソースだけでなく、ローカルのファイルシステム上におけるリソースを統一的に指し示す目的でも使用される。

 関連項目 
 Extensible Resource Identifier (XRI)
 Internationalized Resource Identifier (IRI)
 短縮URI (CURIE)
 Uniform Resource Locator (URL)
 Uniform Resource Name (URN)
 名前空間
 パーセントエンコーディング

 脚注 

 参考資料 
  - Uniform Resource Identifiers (URI): Generic Syntax (旧)
 TS X 0097:2004 - 統一資源識別子(URI) 共通構文 標準仕様書(TS)
  - Uniform Resource Identifier (URI): Generic Syntax
  - URI Design and Ownership
 URL Standard
 URL Standard 日本語訳
 URL W3C Working Group Note
 URI Schemes -  IANAのURIスキーム登録簿

Category:識別子
Category:Uniform Resource Locator
Category:インターネット標準
2396