Uniform Resource Identifier

一定の書式によってリソース(資源)を指し示す識別子

Uniform Resource Identifier(ユニフォーム リソース アイデンティファイア、URI)または統一資源識別子[1](とういつしげんしきべつし)とは、抽象的または物理的なリソースを識別するためのコンパクトな文字列のことである[2]。また、一定の書式によってリソース(資源)を指し示す識別子である[3]1998年8月に RFC 2396 として規定され、2005年1月に RFC 3986 として改定された。URI はUniform Resource Locator (URL) の考え方を拡張したものである。URIによって示されるリソースは限定されておらず、インターネット上に存在しない対象や抽象的な概念を示す場合もある[4]

設計 編集

URL と URN 編集

URI, URL, URN の集合図

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

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

2001年、W3CRFC 3305[5]内で、上記の考え方を古典的な見解とした。ここで示されたW3Cの新たな考え方により、従来のURLとURNとはすべてURIと呼ばれることになった。URLやURNといった語はW3Cによって非公式な表現とされた。

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

共通構文 編集

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

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

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

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

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

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

予約文字(RFC 3986 第2章2節)
gen-delims:/?#[]@N/A
sub-delims!$&'()*+,;=

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

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

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

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

http/httpsスキームの構文例 編集

http/httpsスキームの構文を使った例[9]

スキーム権限パス
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()メソッドが実装されている[10]

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

公式登録のスキーム 編集

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

公式登録されているスキームのリスト[12]
スキーム名称仕様書・出典構文用途・備考
aaaRFC 6733
aaasRFC 6733
aboutアバウトRFC 6694about://<token>[?query][#fragmen]主にウェブブラウザの情報表示なとで用いられる。RFC 6694が定めるトークンはblankひとつのみであるが、固有機能は各トークンを参照し、処理することが推奨されている。
acapRFC 2244
acctRFC 7565
capRFC 4324
cidコンテンツID(Content Identifier)RFC 2392cid:<content-id>HTML形式の電子メールやMHTMLではMIMEマルチパートのコンテンツで指定されたContent-IDが存在してる場合、ドキュメントからcidスキームを使う事で参照できる。
例:<img src="cid:example">
coapRFC 7252
coap+tcpRFC 8323
coap+wsRFC 8323
coapsRFC 7252
coaps+tcpRFC 8323
coaps+wsRFC 8323
cridRFC 4078
dataデータURI(データURL)RFC 2397data:<mediatype(;parameter)>[;base64]<,data>メディアタイプで指定されたコンテンツをデータに添付することで、HTMLドキュメントなどから参照することができる。
コンテンツがプレーンテキスト以外ならBase64でエンコードする必要がある、
davウェブダブ(WebDAV)RFC 4918
dictRFC 2229
dnsDomain Name SystemRFC 4501
exampleRFC 7595example:<foo>スキーム構文例のために登録されたスキーム。RFC 7595は新しいスキームを登録する手順やガイドラインである。
filefile URI scheme英語版RFC 8089file://[[userinfo@]<host>]</path>ホストのファイルパスを提示するスキーム。構文で示してるように、権限は認証情報が必要ない、かつローカルホストであれば省略できる為、file:///からパスが始まる。
ftpファイル・トランスファー・プロトコルRFC 1738#共通構文 参照
geoRFC 5870
goRFC 3368
gopherRFC 4266
h323H.323RFC 3508h323:[<user>@]<host[:port]>[;url-parameter]
http
https
ハイパーテキスト・トランスファー・プロトコルRFC 7230
2章7節1項
及び
2章7節2項
#http/httpsスキームの構文例 参照
iaxRFC 5456
icapRFC 3507
imRFC 3860
imapRFC 5092
infoRFC 4452
ippRFC 3510
ippsRFC 7472
irisRFC 3981
iris.beepRFC 3983
iris.lwzRFC 4993
iris.xpcRFC 4992
iris.xpcsRFC 4992
ldapRFC 4516
leaptofrogansRFC 8589
mailtoRFC 6068
midRFC 2392
msrpRFC 4975
msrpsRFC 4975
RFC 8873
mtqpRFC 3887
mupdateRFC 3656
newsRFC 5538
nfsRFC 2224
niRFC 6920
nihRFC 6920
nntpRFC 5538
opaquelocktokenRFC 4918
pkcs11RFC 7512
popRFC 2384
presRFC 3859
reloadRFC 6940
rtsp
rtspu
rtsps
リアルタイム・ストリーミング・プロトコルRFC 2326
RFC 7826
rtsp://<host[:port]>/path通常rtspとrtspsの通信プロトコルはTCPであるが、rtspuはUDPとなる。
serviceRFC 2609
sessionRFC 6787
shttpRFC 2660
sieveRFC 5804
sipRFC 3261
sipsRFC 3261
smsショートメッセージサービスRFC 5724sms://<recipient[,recipient...]>[?fields]
recipient = [+global-number]<local-number>
snmpRFC 4088
soap.beepRFC 4227
soap.beepsRFC 4227
stunRFC 7064
stunsRFC 7064
tagRFC 4151
tel電話番号RFC 3966
RFC 5341
tel:[+global-number]<local-number>
telnetRFC 4248
tftpRFC 3617
thismessageRFC 2557
tipRFC 2371
tn3270RFC 6270
turnRFC 7065
turnsRFC 7065
tvRFC 2838
urnRFC 8141
vemmiRFC 2122
vncRFC 7869
ws
wss
WebSocketRFC 6455ws://<host>[:port]<path>[?query]ポート番号のデフォルトはhttp/httpsと同様。
xconRFC 6501
xcon-useridRFC 6501
xmlrpc.beepRFC 3529
xmlrpc.beepsRFC 3529
xmppRFC 5122
z39.50rRFC 2056
z39.50sRFC 2056

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

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

関連項目 編集

脚注 編集

  1. ^ JIS X 4159:2005「拡張可能なマーク付け言語 (XML) 1.0」日本産業標準調査会経済産業省) 9頁
  2. ^ Stallings, William (2016). Foundations of modern networking : SDN, NFV, QoE, IoT, and Cloud. Florence Agboma, Sofiene Jelassi. Indianapolis, Indiana. ISBN 978-0-13-417547-8. OCLC 927715441. https://www.worldcat.org/oclc/927715441 
  3. ^ Uniform Resource Identifier (URI): Generic Syntax (英語). January 2005. doi:10.17487/RFC3986. RFC 3986
  4. ^ "Overview of URIs". Uniform Resource Identifier (URI): Generic Syntax (英語). sec. 1.1. doi:10.17487/RFC3986. RFC 3986
  5. ^ RFC 3305 - URIs, URLs, and URNs: Clarifications and Recommendations 1.0
  6. ^ URL Standard Goals” (英語). WHATWG (2017年6月23日). 2017年6月23日閲覧。 “Align RFC 3986 and RFC 3987 with contemporary implementations and obsolete them in the process.”
  7. ^ URL Standard (日本語訳) 目標” (2017年6月1日). 2017年6月23日閲覧。 “RFC 3986RFC 3987 を現今の実装に揃わせて、その過程の中でそれらを過去のものにする。”
  8. ^ “The Web’s Inventor Regrets One Small Thing” (英語). ニューヨーク・タイムズ. (2009年10月12日). https://bits.blogs.nytimes.com/2009/10/12/the-webs-inventor-regrets-one-small-thing/ 2021年8月31日閲覧。 
  9. ^ ウェブ上のリソースの識別”. MDN Web Docs. Mozilla. 2021年9月5日閲覧。
  10. ^ URLSearchParams”. MDN Web Docs. Mozilla. 2021年8月31日閲覧。
  11. ^ RFC 7230 参照
  12. ^ a b Uniform Resource Identifier (URI) Schemes” (英語). IANA. 2021年9月1日閲覧。
  13. ^ draft-hoehrmann-javascript-scheme-03” (英語). Internet Engineering Task Force (2010年9月25日). 2021年9月8日閲覧。

参考資料 編集