| 説明 | 相対参照の基準となる基底URIを指定する |
|---|---|
| 語源 | BASE uri |
| 所属モジュール | Base |
| 所属コンテントセット | なし |
| 内容 | なし |
| 内容の書式 | EMPTY |
| 関連項目 | head |
| 公式な実装 | DTD |
base要素は、相対参照を解決する (Resolve)時に使われる絶対URIを指定します。直感的な説明だけで良ければ、使用例を見るだけでいいでしょう。この文書では、ある程度厳密さを犠牲にしつつ、直感と厳密の間で簡単にURIの説明を加えます。
絶対URI (Absolute URI)は、他に何ら情報を必要とする事無くリソースを完全に識別できるURI から断片識別子 (Fragment Identifier)を除いたものです。厳密な説明は避けると、大体次のような形をしています(詳しくはUniform Resource Identifier (URI): Generic Syntax(RFC3986)の4.3. Absolute URIやHypertext Transfer Protocol -- HTTP/1.1(RFC2616)の3.2.2 http URLを参照の事)。
4のFTP スキームを使ったURIや、5のURN スキームを使ったURIは大きく本筋から逸れるので省略します。
絶対URIは、正規表現で次のように表す事ができます。
[プログラムコード開始]
[プログラムコード終了]
厳密さを犠牲にしてさらっと説明します。
スキーム。リソースを入手する手法。HTTP
を使う場合、httpのみが取り得る値。
ホスト。リソースの保持者を識別するもの。例えば、W3C
のサーバならwww.w3.org、XREAの26番目のサーバにあるw4ardという名前のバーチャルサーバならw4ard.s26.xrea.com。
ポート。ここでは、繋ぐサーバのポート。portが空か、コロンごと省略されている時は80だと見なされる。
パス。リソースの位置を表すもの。path-abemptyは絶対パスか空のパス、path-absoluteは絶対パス、path-noscheme(後述)はコロンを含まないセグメントから始まるパス、path-rootlessはセグメントから始まるパス、path-emptyは空のパス。
セグメント。パスの構成要素。空でもいいし、適当な長さの文字列でも良い。大抵エンティティ名(ディレクトリ名かファイル名)、しばしばエイリアス、時々識別子、稀にその他。
クエリ。クエリ文字列。サーバーサイドのプログラムなどから利用できる。クエスチョンマークごと省略できる。
URI参照 (URI Reference)は、リソースの識別子を示す時に最も広く使われているものです。 URIデータタイプは「リソースのURI」となっていますが、実際にはURI参照の事です。URI参照はURIを参照する手段で、URI構文で表されるURIそのものか、relative-ref構文で表される相対参照の何れかです。
[プログラムコード開始]
[プログラムコード終了]
URI構文は、absolute-URIの末尾に'#'と断片識別子を付け加える事ができます。relative-refは相対参照で説明します。
相対参照 (Relative Reference)は、階層構造の利点を活かして、別のリソースを表現するものです。RFC2396では相対URI (Relative URI)や部分URI (Partial URI)などという用語が使われていましたが、それがURIを参照する方法ではなく、URIのサブセット(部分集合)だと誤解される事があった為に、RFC3986では単に相対参照と呼んでいます。
NOTE: Previous specifications used the terms "partial URI" and "relative URI" to denote a relative reference to a URI. As some readers misunderstood those terms to mean that relative URIs are a subset of URIs rather than a method of referencing URIs, this specification simply refers to them as relative references.
相対参照はURIに似ていますが、schemeの指定がありませんし、path-rootlessの代わりにpath-noschemeを持ち得ます。なお、繰り返しますが、相対参照はURIを参照する方法であって、URIそのものではありません。
[プログラムコード開始]
[プログラムコード終了]
また、厳密な説明はRFC3986をご覧下さい。ここでは例を挙げるに留めます。なお、'.'、'..'はドットセグメント (Dot-segment)として知られ、ファイルシステムにおけるカレントディレクトリ、ペアレントディレクトリとほぼ同等です。
ここからが本題です。相対参照が結局どのURIを参照しているのかを見つける事を、前述の通り解決する
(Resolve)と言います。相対的なものは、基準が定まって初めて絶対的な位置を定義できるように、断片識別子のみの参照(例えば#heading.1)以外の相対参照は、その基準となる基底URI
(Base URI)が定まっている時にしか安心して使う事ができません。base要素は、相対参照を解決する時に使われる文書の基底URIを確立する
(Establish)時に介入します。
基底URIは、優先順位の高い方から順に、次のようなものから確立されます。
正にbase要素の事です。href属性でURI参照(但し、相対参照では駄目で、絶対URIでなければならない)を指定する事で、文書中に効果の及ぶ基底URIを指定できます。
但し、object要素のdata属性で埋め込まれる文書には影響しません。埋め込まれる文書は一見文書の一部に見えますが、描画以外では完全に独立しています。
また、object要素の中では例外的にcodebase属性がより高い優先順位を持ちます。
エンティティ (Entity。実体)は、ここでは識別子 (Identifier)とその他の環境要因によって実際に示されたもの、と考えればよいでしょう。例えばimage.png、image.gifを同じ階層に置き、ウェブサーバでコンテントネゴシエーションを有効にした場合、識別子imageで示されるエンティティは環境要因に左右されます。GIFイメージはサポートするけれどもPNGイメージは描画できないユーザーエージェントは、同じ内容のイメージなら、できるだけGIFイメージを返してくれるようサーバに要求します。サーバはこれにimage.gifを返します。エンティティはimage.gifです。一方、PNGイメージもGIFイメージもサポートするユーザーエージェントは、どちらでも受け付けるけれども、(恐らく)優れたPNGイメージを優先してくれとサーバに要求します。これに対してサーバはimage.pngを返します。エンティティはimage.pngです。
尤も、「内包するエンティティ」の「エンティティ」はイメージの事ではなく、例えばHTTPメッセージやアーカイブファイルなどです。XHTML文書を幾つか格納するアーカイブがあった時、格納されている個々のXHTML文書が文書中に基底URIを埋め込んでいなければ、アーカイブ自体の基底URIが個々のXHTML文書の基底URIになります。アーカイブ自身の基底URIは、同じように確立されます。
大抵の場合、つまりXHTML文書が単体で存在している時、このステップは飛ばされます。
XHTML文書の取得にURIが使われた場合、そのURIが基底URIと見なされます。例えば、この文書(http://w4ard.s26.xrea.com/reference/xhtml11/element/base)はbase要素も使っていないしアーカイブなどに内包されている訳でもないので、基底URIはhttp://w4ard.s26.xrea.com/reference/xhtml11/element/baseになります。
文書を取得するまでの過程の中でリダイレクトが使われた場合、最後のURI、即ちリソースを実際に取得するのに使われたURIが基底URIになります。
上記の何れのステップでも基底URIを確立できなければ、完全にアプリケーションに依存するデフォルトの基底URIを使う事になります。これは、同じ内容なのに、扱うアプリケーションによって異なる解釈がされる恐れがあるので、できる限り避けるべきです。
こういう状況は、電子メールに埋め込まれた文書などで起こり得ます。文書の作成者は、こういった事が起こらないようにきちんと配慮すべきです。他のステップで基底URIが確立できない時に唯一安心して使えるのは、前述の通り断片識別子のみによる参照(例えば#heading.1)だけです。
URIを解釈するプログラム用の解説ではないので、変形 (Transformation)、ドットセグメント除去 (Removing Dot-segments)、再構成 (Recomposition)後の例を示すに留めておきますが、相対参照の解決は次のように行われます。
http:で相対参照が//www.w3.org/TRの時基底URIからschemeを、相対参照からauthorityとpathを取って、http://www.w3.org/TR。
http://www.w3.orgで相対参照がTRの時基底URIからschemeとauthorityを、相対参照からpathを取って'/'で繋ぎ、http://www.w3.org/TR。
http://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が//www.w3.org/TR/2001/REC-xhtml11-20010531の時基底URIからschemeを、相対参照からauthorityとpathを取って、http://www.w3.org/TR/2001/REC-xhtml11-20010531。相対参照がauthorityを持っている場合は、基底URIからはschemeしか取られない。
http://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が/stylesheet/commonの時基底URIからschemeとauthorityを、相対参照からpathを取って、http://w4ard.s26.xrea.com/stylesheet/common。相対参照のpathが絶対パスであれば、基底URIのpathは無視される。
http://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が./element/の時基底URIからschemeとauthorityを取り、基底URIのpathと相対参照のpathをマージして、http://w4ard.s26.xrea.com/reference/xhtml11/element/。
http://w4ard.s26.xrea.com/reference/xhtml11/how-toで相対参照が../の時基底URIからschemeとauthorityを取り、基底URIのpathと相対参照のpathをマージして、http://w4ard.s26.xrea.com/reference/。
http://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が?queries#fragmentの時相対参照のpathが空なので、基底URIからschemeとauthorityとpathを取り、相対参照のqueryとfragmentを取って、http://w4ard.s26.xrea.com/reference/xhtml11/?queries#fragment。
http://w4ard.s26.xrea.com/reference/xhtml11/で相対参照が../program/search?queriesの時基底URIからschemeとauthorityを取り、基底URIのpathと相対参照のpathをマージし、相対参照のqueryを取って、http://w4ard.s26.xrea.com/reference/program/search?queries。
変形については、RFC3986の5.2.2. Transform Referencesに擬似コードで厳密なアルゴリズムが紹介されています。
尤も、URIはそんなにRFC3986とにらめっこしなくても、直感的に理解できます。
例えば、次の目次として使われている文書がhttp://www.example.com/software/smart-finder/toc.htmlというURIで表される場合を考えてみましょう。
[プログラムコード開始]
[プログラムコード終了]
この文書で使われている相対参照は、./manual/以下のリソースばかりを指しています。そこで、<base href="http://www.example.com/software/smart-finder/manual/"/>を相対参照が現れる前に
head要素の子に追加する事で簡略化します。
[プログラムコード開始]
[プログラムコード終了]
<base href="http://www.example.com/software/smart-finder/manual"/>(スラッシュが落ちている)とやらないように気を付けて下さい。パフォーマンスの問題の前に、ドットセグメント('.'や'..')の除去の段階で異なる解釈をされます。
| [base] | ||
|---|---|---|
| Published | : | 2006-03-26T09:00:00+09:00 |
| Last Modified | : | 2007-04-29T18:24:06+09:00 |
| Table of Contents | : | 要素目次 |
| Index | : | 要素索引 |
| Verified with | : |
|