URI(7) | Linux Programmer's Manual | URI(7) |
名前
uri, url, urn - uniform resource identifier (URI), URL と URN も含む.書式
URI = [ absoluteURI | relativeURI ] [ "#" fragment ]
absoluteURI = scheme ":" ( hierarchical_part | opaque_part )
relativeURI = ( net_path | absolute_path | relative_path ) [ "?" query ]
scheme = "http" | "ftp" | "gopher" | "mailto" | "news" | "telnet" |
"file" | "man" | "info" | "whatis" | "ldap" | "wais" | ...
hierarchical_part = ( net_path | absolute_path ) [ "?" query ]
net_path = "//" authority [ absolute_path ]
absolute_path = "/" path_segments
relative_path = relative_segment [ absolute_path ]
説明
Uniform Resource Identifier (URI) は抽象的・物理的なリソース (web ページなど) を識別するための短い文字列である。 Uniform Resource Locator (URL) は URI の一種で、リソースの名前などの属性でではなく、そのリソースに対応するアクセスメカニズムを通してリソースを指定する (つまりネットワーク上の「場所 (location)」を指定する)。 Uniform Resource Name (URN) は URI の一種で、これは対象のリソースが廃棄されたり利用できなくなった場合にも、グローバルに他と重なることなく永続しなければならない。URI は、 web ブラウザなどのツールでハイパーテキストリンクのリンク先を指定する時の標準的な方法である。文字列 "http://www.kernelnotes.org"は URL である (従って URI でもある)。多くの人々は、 URL という言葉をほぼ URI の同義語として使っている (しかし技術的には URL は URI のサブセットである)。
URI は絶対的にも相対的にも指定できる。絶対的な指定は、リソースをコンテクストに依存しないかたちで参照する。相対的な指定は、リソースを現在のコンテクストからの差異によって記述する。相対パス参照では、 "."および ".."だけのパス部分 (path segment) は特別な意味を持ち、それぞれ「現在の階層レベル」および「現在の階層の一つ上のレベル」として扱われる (UNIX 風のシステムと同様)。コロン文字を含むパス部分は相対 URI パスの先頭に用いることはできない (つまり "this:that"はダメ)。スキーム名と区別できないからである。このような場合には ./ を前置すること (つまり "./this:that"とする)。 MS-DOS の子孫 (Microsoft Windows など) は、デバイス名のコロンを URI では垂直バー ("|") に置き換える。したがって "C:"は "C|"となる。
フラグメント指定子 (fragment identifier) は、(もし含まれていれば) リソース中の名前付けされた特定の部分 (フラグメント) を参照する。'#'指定子以降の文字列がフラグメントを指定する。'#'で始まる URI は現在のリソース中のフラグメントを参照する。
使い方
URI のスキームには色々な種類があり、それぞれ固有のルールや意味が追加されている。しかしできるだけ統一したものにしようという努力もなされている。例えば、多くの URL スキームは「機関 (authority)」に対して以下の書式 (ここでは ip_server と呼ぶことにする) を許している (角括弧内部は省略可能)。
ip_server = [ user [ : password ] @ ] host [ : port]
このフォーマットには、ユーザ名、ユーザ名+パスワードを指定できる。ポート番号を追加することも可能である。 host はホストコンピュータの名前で、 DNS で定義される名前か IP アドレス (ピリオドで区切られた数字) で指定する。したがって URI <http://fred:fredpassword@xyz.com:8080/>は、ホスト xyz.com に fred として (パスワードを使って) ポート 8080 を使ってログインする。パスワードは可能なら URI には含めないほうが良いだろう。パスワードを直書きすると様々なセキュリティ上のリスクが生じるからである。 URL にユーザ名だけを与え、パスワードを与えない場合は、リモートサーバはパスワードを要求してくる。 URL を解釈したプログラムが、ユーザにこの入力を促すことになろう。
以下に、 UNIX 風のシステムで非常に良く用いられており、多くのツールが理解するスキームを示す。 URI を使うツールの多くでは、内部スキームや特殊なスキームも使えることが多い。そのようなスキームに関してはツールのドキュメントを見ること。
http - Web (HTTP) サーバ
http:// ip_server/ path
http:// ip_server/ path? query
これは web (HTTP) サーバにアクセスするための URL である。デフォルトのポートは 80。パスがディレクトリを参照しているときは、返される情報は web サーバが選択する。通常は、 "index.html"や "index.htm"のようなファイルがあれば、その内容が返される。なければ、カレントディレクトリのリストが (適切なリンクとともに) 生成されて返される。例としては <http://lwn.net>など。
問い合わせ (query) を、古い "isindex"フォーマットによって送ることもできる。このフォーマットは単語またはフレーズからなり、等号 (=) は含まない。より長い "GET"フォーマットでも問い合わせは行える。このフォーマットには、一つ以上の問い合わせエントリが key= value という形式で含まれる。それぞれのエントリはアンパサンド (&) で区切られる。 key は複数個指定することもできる。しかしそれに意味があるかどうかは web サーバとアプリケーションプログラムが決める。 HTML/XML/SGML と GET 問い合わせ形式の間には、不幸な関係がある。一つ以上のキーの含まれる URI が SGML/XML 文書 (HTML もそう) に埋めこまれる際には、アンパサンド (&) は &と書かなければならない。全ての問い合わせがこの形式を使うわけではない。フォームが長くなると URI に入れるには長すぎるから、別の通信メカニズム (POST と呼ばれる) が用いられる。 POST では URI にはデータは含まれない。より詳しい情報は、 http://www.w3.org/CGIE にある Common Gateway Interface の仕様書を見よ。
ftp -ファイル転送プロトコル (FTP)
ftp:// ip_server/ path
これはファイル転送プロトコル (FTP) を通してファイルにアクセスするための URL である。デフォルトの (制御用) ポートは 21 である。ユーザ名がない場合には、ユーザ名 anonymous が与えられる。そしてその場合には、クライアントの多くは要求した人のインターネットメールアドレスをパスワードとして与える。例としては <ftp://ftp.is.co.za/rfc/rfc1808.txt>など。
gofer - Gofer サーバ
gopher:// ip_server/ gophertype selector
gopher:// ip_server/ gophertype selector%09 search
gopher:// ip_server/ gophertype selector%09 search%09 gopher+_string
デフォルトの gopher ポートは 70 である。 gophertype は 1 文字からなるフィールドで、 URL が参照している Gopher のリソースタイプを示す。パス全体が空であってもよく、その場合は区切りの "/"も省略できる。このとき gophertype のデフォルトは "1"になる。
selector は Gopher セレクタ文字列である。Gopher プロトコルでは、 Gopher セレクタ文字列はオクテット文字からなり、 16進数の 09 (US-ASCII の HT または tab)、 0A (US-ASCII の LF 文字)、 0D (US-ASCII の CR 文字) 以外ならどんなオクテットも指定できる。
mailto -電子メールアドレス
mailto: email-address
これは電子メールアドレスで、通常 name@ hostname という形式をとる。電子メールアドレスの正しいフォーマットに関するより詳しい情報は mailaddr(7) を見よ。 % 文字はすべて %25 と書き直さなければならないことに注意。例としては <mailto:dwheeler@dwheeler.com>など。
news -ニュースグループ・ニュースメッセージ
news: newsgroup-name
news: message-id
newsgroup-name はピリオドで区切られた階層的な名前である。例えば "comp.infosystems.www.misc"など。 <newsgroup-name>が "*" (つまり <news:*>) の場合には、「参照できる全てのニュースグループ」の意味になる。例としては <news:comp.lang.ada>など。
A message-id corresponds to the Message-ID of IETF RFC 1036, without the enclosing "<" and ">"; it takes the form unique@ full_domain_name. A message identifier may be distinguished from a news group name by the presence of the "@" character.
telnet - telnet ログイン
telnet:// ip_server/
Telnet URL スキームは対話的なテキストサービスに Telnet プロトコルを通してアクセスするために用いられる。最後の "/"文字は省略してよい。例としては <telnet://melvyl.ucop.edu/>など。
file -通常のファイル
file:// ip_server/ path_segments
file: path_segments
これはローカルに直接アクセスできるファイルを示す。特殊なケースとして、 host には "localhost"という文字列を用いたり、空文字にしてもよい。これは「URI が解釈されたマシン」とみなされる。 path がディレクトリの場合は、ビューアはディレクトリの内容をリンクを張ったかたちで表示するとよいだろう。しかし現在は、まだ全てのビューアがこの動作をするわけではない。 KDE は生成ファイル (generated file) を URL <file:/cgi-bin>の形式でサポートしている。与えられたファイルが見付からなかった場合は、ファイル名をグロブによって展開すると良いかもしれない ( glob(7) および glob(3) を見よ)。
二つめの書式 (例えば <file:/etc/passwd>) もローカルファイルを参照する正しいフォーマットである。しかし古い標準ではこの書式を許していなかったので、これを URI として認識しないプログラムも存在する。より汎用的な文法は、サーバ名に空文字を用いるもの、つまり <file:///etc/passwd>のようなものである。この形式も指す内容は同じであり、パターンマッチやより古いプログラムでも URI として認識されやすい。もし意図するところが「現在の場所からスタート」なら、スキームは一切用いるべきではない。 <../test.txt>のような、スキームに依存しない相対リンクを用いること。このスキームの例としては <file:///etc/passwd>など。
man - man ページ文書
man: command-name
man: command-name( section)
これはローカルのオンラインマニュアル (man) リファレスページを参照する。 command-name には括弧とセクション番号を追加してもよい。セクション番号の意味について詳しく知りたい場合は man(7) をみよ。この URI スキームは UNIX 風のシステム (Linux など) に特有のものであり、現在はまだ IETF による登録はされていない。例としては <man:ls(1)>など。
info - info ページ文書
info: virtual-filename
info: virtual-filename# nodename
info:( virtual-filename)
info:( virtual-filename) nodename
このスキームは、オンラインの info リファレンスページ (texinfo ファイルから生成される) を参照する。 info ページは GNU ツールなどのプログラムで用いられている文書フォーマットである。この URI スキームは UNIX 風のシステム (Linux など) に特有のものであり、現在はまだ IETF による登録はされていない。この文書の執筆時において、 GNOME と KDE はそれぞれ異なる文法の URI を用いており、お互い相手の文法を受け入れない。最初の 2 つの書式は GNOME の書式である。ノード名 (nodename) のスペースはすべてアンダースコアに変換される。 3 つめと 4 つめは KDE の書式である。ノード名のスペースはそのままスペースで書かれる (URI の標準では禁止されているのだが)。将来は多くのツールがこれらの書式すべてを理解するようになり、ノード名のアンダースコア、スペースを両方とも理解できるようになることを期待したい。 GNOME でも KDE でも、ノード名が省略された場合は、ノード名として "Top"が用いられる。 GNOME 書式の例としては <info:gcc>や <info:gcc#G++_and_GCC>など、 KDE 書式の例としては <info:(gcc)>や <info:(gcc)G++ and GCC>など。
whatis -文書検索
whatis: string
このスキームは、コマンドに関する短い (1 行の) 説明を集めたデータベースを検索し、 string を含む文字列をリストして返す。単語が完全にマッチした結果だけが返される。 whatis(1) を見よ。この URI スキームは UNIX 風のシステム (Linux など) に特有のものであり、現在はまだ IETF による登録はされていない。
ghelp - GNOME ヘルプ文書
ghelp: name-of-application
与えられた application に対応する GNOME help をロードする。この書式を用いた文書はまだあまり多くない。
ldap -軽量ディレクトリアクセスプロトコル
ldap:// hostport
ldap:// hostport/
ldap:// hostport/ dn
ldap:// hostport/ dn? attributes
ldap:// hostport/ dn? attributes? scope
ldap:// hostport/ dn? attributes? scope? filter
ldap:// hostport/ dn? attributes? scope? filter? extensions
This scheme supports queries to the Lightweight Directory Access Protocol (LDAP), a protocol for querying a set of servers for hierarchically organized information (such as people and computing resources). See RFC 2255 for more information on the LDAP URL scheme. The components of this URL are:
- hostport
- クエリーを行う LDAP サーバ。ホスト名を書く。続けてコロンとポート番号を追加することもできる。 LDAP のデフォルトのポートは TCP ポート 389 である。省略されると、どの LDAP サーバを用いるかはクライアントが決定する。
- dn
- the LDAP Distinguished Name, which identifies the base object of the LDAP search (see
RFC 2253 section 3).
- attributes
- コンマ区切りの、返される属性 (attribute) のリスト。 RFC 2251 の section 4.1.5 を見よ。省略されると全ての属性が返される。
- scope
- 検索のスコープを指定する。 "base" (base オブジェクト検索), "one" (1 レベル検索), "sub" (サブツリー検索) のいずれかを指定する。省略すると "base"が仮定される。
- filter
- specifies the search filter (subset of entries to return). If omitted, all entries should be returned. See
RFC 2254 section 4.
- extensions
- コンマで区切られた type=value ペアのリスト。ここで =value の部分は、それを要求しないオプションに対しては省略できる。'!'が前置された extension は critical (サポートしていなければならない) であり、そうでなければ critical ではない (省略できる)。
LDAP のクエリーは、例とともに説明するのが最も簡単である。次の例は、 ldap.itd.umich.edu に、 U.S. にある University of Michigan の情報を尋ねる例である。
ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US
郵便用の住所属性だけを取得する場合は、次のようにリクエストする:
ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US?postalAddress
host.com のポート 6666 に、 University of Michigan にいる common name (cn) が "Babs Jenson"の人の情報を尋ねる場合は、次のようにリクエストする:
ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Babs%20Jensen)
wais -広域情報サービス
wais:// hostport/ database
wais:// hostport/ database? search
wais:// hostport/ database/ wtype/ wpath
This scheme designates a WAIS database, search, or document (see IETF RFC 1625 for more information on WAIS). Hostport is the hostname, optionally followed by a colon and port number (the default port number is 210).
最初の書式は WAIS のデータベースに対する検索の指定である。二つめの書式は特定の WAIS データベース database に対する検索の指定である。三つめの書式は WAIS データベースにある特定の文書を取出す指定である。 wtype は WAIS のオブジェクト形式指定であり、 wpath は WAIS document-id である。
その他のスキーム
他にも多くの URI スキームが存在する。 URI を受付けるほとんどのツールは、内部 URI のセットをサポートする (例えば Mozilla は内部情報用の about: というスキームを受付けるし、 GNOME ヘルプブラウザはいろいろな出発点用に toc: というスキームを持っている)。定義されたスキームはたくさんあるが、現時点で広く用いられてはいない (例えば prospero とか)。 nntp: スキームは news: スキームが好んで用いられるようになったので使わないほうが良い。 URN は urn: スキームによって、階層的な名前空間 (例えば urn:ietf:... は IETF 文書を示す) としてサポートされるべきであるが、現時点では URN はあまり用いられていない。全てのツールが全てのスキームをサポートしているわけではない。
文字エンコード
URI では、色々な状況下で入力できるように、文字の種類を制限している。以下の文字は予約されている。すなわち、これらの文字は URI に登場することがあるが、それらの利用法 (解釈のされ方) は予約された目的に制限されている (衝突するデータは URI にする前にエスケープしなければならない)。
-
; / ? : @ & = + $ ,
未予約文字 (unreserved character) は URI に使ってよい。これには英字の大文字と小文字、10 進の数字、および以下の句読文字・記号が含まれる
-
- _ . ! ~ * ' ( )
他の文字はすべてエスケープしなければならない。エスケープされたオクテットは 3 文字からなる: 先頭にパーセント文字 "%"、それに続けてオクテットコードを表す 2 文字の 16 進数字である (16 進数の英字は大文字小文字どちらでも良い)。例えば空白文字は "%20"のようにエスケープしなければならず、タブ文字は "%09"、 "&"は "%26"となる。パーセント文字 "%"は常にエスケープを示す予約された目的に用いられるので、 "%"自身を表すには "%25"とエスケープしなければならない。クエリーのテキストでは、スペース文字をプラス記号 (+) でエスケープすることも一般に良く行われる。この慣例は関連 RFC で実際に定義されているわけではない (代わりに %20 を推奨している) が、クエリーテキストを受付けるツールは、この書式への対応を用意しておくべきであろう。 URI は、常に「エスケープされた」かたちで表示される。
未予約文字もエスケープすることができ、これによって URI の意味するところが変わるわけではない。しかしURI にその非エスケープ文字が現れることが許されないような特殊な場合を除いて、これは避けるべきである。例えば、 HTTP URL の path において "%7e"が "~"の代わりに用いられることがあるが、この二つは HTTP URL としては等価である。
US ASCII キャラクタセット以外の文字を URI として扱う場合、 HTML 4.1 規格 (section B.2) 及び IETF RFC 2718 (section 2.2.5) は以下の手法を用いるよう推奨している。
- 1.
- キャラクタ列を UTF-8 (IETF RFC 2279, utf-8(7) 参照) に変換し、
- 2.
- URI エスケープ機構を用いる。つまり、安全でないオクテットを %HH でエンコードする。
URI を書くには
URI を書く時には、ダブルクォートの内部に書く (例: "http://www.kernelnotes.org") か、 angle ブラケットで囲む (例: <http://lwn.net>) か、一行に URI だけを書くかする。ダブルクォートを使う人に警告: 絶対に句読点 (文末のピリオドやリスト区切りのコンマ) を URI の内部に移動してはならない。代わりに angle ブラケットを使うか、外にある文字をクォーテーションマークの内部に決して含めないような引用方式に切替えること。後者の方式は "Hart's Rules"や "Oxford Dictionary for Writers and Editors"によれば「新しい (new) 引用方式」あるいは「論理的 (logical) な引用方式」と呼ばれており、イギリス人や世界中のハッカー達はこちらの慣習を好んでいる (より詳しい情報は Hacker Writing Style の Jargon File のセクション http://www.fwi.uva.nl/~mes/jargon/h/HackerWritingStyle.html を見よ)。古い文書では、 "URL:"という文字列を URI の直前に挿入することを勧めているものもあるが、しかしこの形式はまったく流行しなかった。URI の書式は曖昧さを排除するように設計されている。しかし URI が広まるにつれ、昔ながらのメディア (TV、ラジオ、新聞、看板などなど) は URI 参照を省略したかたち、すなわち機関部とパス部だけでリソースを指定することが多くなっている (例: <www.w3.org/Addressing>)。このような参照はマシンというよりは人間向けのもので、コンテキストベースの推測によって URI の補完が可能であることをあてにしているのである (例えば "www"ではじまるホスト名なら "http://"がつくだろうし、 "ftp"ではじまるホスト名なら "ftp://"がつくだろう)。多くのクライアントの実装では、この種の参照を推測によって解決する。このような推測は時代とともに変わりうる。特に新しいスキームが導入されるとそうである。 URI の省略形では相対 URL パスの区別が付けられないので、省略形 URI 参照は相対 URI の利用できるところでは使えない。つまり定義済みのベース (ダイアログボックスなど) がない場合に限って利用できる。文書内部でのハイパーテキストリンクには省略形 URI を使ってはならない。上述の標準フォーマットを使うこと。
注意
Linux システムで URI を受付けるツール (例えば web ブラウザなど) は、上にあげた全てのスキームを (直接または間接に) 扱えるべきである。 man: や info: も含めて、である。スキームの処理に他のプログラムを実行するのは良いことだし、実はすすんでそうすべきである。技術的には、フラグメントは URI の一部ではない。
URI (URL も含む) をデータフォーマットに埋めこむ方法に関する情報は、そのフォーマットのドキュメントを見よ。 HTML は <A HREF=" uri"> text</A>を用いる。 texinfo は @uref{ uri} という書式を用いる。 man と mdoc は、最近追加された UR マクロを使う。あるいは URI をそのままテキストに埋めこむ (ビューアが :// を URI の一部と解釈できなければならない)。
デスクトップ環境である GNOME と KDE は、それぞれ受付ける URI が (特にそれぞれのヘルプブラウザにおいて) 異なっている。 man ページをリストするには、 GNOME では <toc:man>を用い、 KDE では <man:(index)>を用いる。また info ページをリストするには、 GNOME では <toc:info>を用い、 KDE では <info:(dir)>を用いる (本 man ページの著者は KDE のアプローチのほうが好みである。しかしより標準的な書式の方が更に良いが)。一般に KDE は生成ファイル (generated file) のプレフィックスとして <file:/cgi-bin/>を用いる。 KDE は HTML の文書を <file:/cgi-bin/helpindex>経由でアクセスするのが好みなようである。 GNOME は文書の保管・検索に ghelp スキームを用いる方法を取っているようだ。どちらのブラウザも、現時点では file: によるディレクトリ参照を扱えない。したがってディレクトリ全体をブラウズ可能な URI で参照することが難しい。先に述べたように、これら二つの環境では info: スキームの扱いが異なっている (おそらく最も重要な差異であろう)。 GNOME と KDE が共通 URI フォーマットに収斂することが望ましい。この man ページが、将来はその収斂した結果を記述できることを望む。この作業への助力を喚起したい。
セキュリティ
URI そのものはセキュリティの脅威を引き起こすものではない。ある時点ではリソースの場所を与えていた URL が、ずっとそうでありつづけるという保証は一般にはない。またある URL が、将来には別のリソースを示さないとも限らない。このような保証は、その名前空間とリソースとを管理している個人に帰するものに過ぎない。無害に見える操作 (リソースに関連づけられたエンティティの取得など) によって、実際にはリモートにダメージを与える動作を引き起こすような URL を記述することも場合によっては可能である。危険な URL の典型的なものは、そのネットワークプロトコルに予約されているポート番号とは異なるポートを指定しているものである。 URL の内容には命令が含まれていて、そのプロトコルにしたがって解釈されたとき、予期されない動作を引起こすのである。例をあげると、 gopher の URL によって、意図しないメッセージやなりすましメッセージなどが SMTP サーバ経由で送信されるようなことがあった。
そのプロトコルのデフォルト以外のポート番号を指定している URL を用いるときには注意すべきである。特にその番号が予約空間の内部にある場合には。
URI に、そのプロトコルに対するデリミタがエスケープされたかたちで入っている場合も注意が必要である (例えば telnet プロトコルに対する CR 文字や LF 文字など)。なぜならこれらは転送前にエスケープが外されないからである。これはプロトコルに反しており、予期しない、おそらくは害になるようなリモート動作を引起こす結果となりかねない。
秘密にしておくべきパスワードを含んだ URI を使うのが賢くないのは明らかである。特に、パスワードを URI の "userinfo"の部分に使うのは絶対に避けるべきである。ただしその "password"のパラメータを意図的に公開したい場合は別であるが。
バグ
文書は様々な場所に置かれうる。したがって現時点では、任意のフォーマットで書かれた一般のオンライン文書に対する良い URI スキームが存在しない。 <file:///usr/doc/ZZZ>形式の参照は使えない。なぜならディストリビューションやローカルへのインストールの際の条件によって、ファイルは異なるディレクトリに置かれることがあるからである (/usr/doc か /usr/local/doc か /usr/share かその他の場所か、などなど)。また、ディレクトリ ZZZ は通常バージョンが変わると異なったものになる (ファイル名のグロブによってある程度克服できるだろうが)。最後にもう一つ、文書をインターネットから (ローカルのファイルシステムにファイルをロードするのではなく) 動的にロードする人々は、なかなか file: スキームを使ってくれない。将来には新たな URI スキーム (例えば "userdoc:"のような) が追加され、より詳しい文書へのクロスリファレンスが、その文書の正確な場所をプログラムが知らなくても可能になるかもしれない。あるいは、ファイルシステム規格の将来の版でファイルの場所の指定をより厳密にして、 file: スキームによる文書の位置指定が可能になるかもしれない。プログラムやファイルフォーマットの多くでは、 URI を使ったリンクを取り込んだり実装したりする方法がない。
プログラムの多くは、これらの URI フォーマットをすべては扱えない。ユーザの環境 (テキストかグラフィックか、デスクトップ環境、ローカルユーザの好み、現在実行されているツール) などを自動的に検知して、任意の URI をロードし、その URI に適したツールを起動するような標準的な仕組みがあるといいのだろうが。
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-08-05 | Linux |