Uniform Resource Identifier

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

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

## 設計
### URL と URN

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

2001年、W3Cは内で、上記の考え方を古典的な見解とした。以降、従来の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（クエリ）
: **クエリ**は`?`の区切り文字から始まり、`#`また末尾で終える。**パス**と違い、階層的なデータを含まない。、第3章4節において明確な構文は示されていない。
; fragment（フラグメント、素片）
: **フラグメント**は`#`の区切り文字から始まる。任意な扱いで、プライマリ（一次）リソースを参照し、セカンダリ（二次）リソースへ提供するフラグメント識別子を含む。**クエリ**と同様に明確な構文は示されていない。一例としてプライマリリソースがHTMLドキュメントの場合、要素の`id`属性に何かしらの値を指定し、フラグメントにも同様の値を指定することで、ウェブブラウザは表示の際にその要素の位置までスクロールする。ウィキペディアでは「」と呼ばれる機能が該当する。

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

### 予約文字とパーセントエンコーディング

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

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

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

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

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

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

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

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

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

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

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

### 公式登録のスキーム

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

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

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

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

## 関連項目
* 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スキーム登録簿