記事本文
パスの話続き
<a href="./"> と <a href="/"> はどう違う ? はざっとしたメモ書きだったとはいえ、自分が間違えて覚えていた言葉をそのまま使っていますね。 私はよく仕様や大元の情報をあたるように言っているのに、これではいけません。
ということで、自分の曖昧な認識を正しいものとするために、改めてきっちりとメモ。 RFC の記述は読みたくない、既に知っているから今更読まなくてもいいといった方は、 http://hxxk.jp/2006/12/28/0223 のリライト部分だけお読み下さい。
……なんて書き出しで 12 月 28 日に投稿しようと思っていたら、何かと雑事に時間を取られていつの間にか 1 月 5 日ですよ ? 新年あけましたが早速風邪をひいてしまって、いまいちおめでたくありません。 今年もそれなりによろしくお願いします。
RFC3986 より
「今まで読んでなかったのかよ」と誰かから怒られそうな気がしますが、 RFC3986 を読んでまとめました。 架空の CGI が http://hxxk.jp/cgi-bin/beerlist.cgi という URI に置かれていると仮定しています。
- URI (3. Syntax Components)
-
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
という形式で、 http などのスキーム名やクエリ、フラグメントも含みます。 異なるホストへのリンクを記述する時はこちらを使うことになります。http://hxxk.jp/cgi-bin/beerlist.cgi?brewery=Hoegaarden#White のような形ですね。 (beerlist.cgi は実際にはありません。この URI にアクセスしても 404 Not Found になりますよ。 )
- 絶対 URI (4.3. Absolute URI)
-
absolute-URI = scheme ":" hier-part [ "?" query ]
という形式で、フラグメントは含みません。http://hxxk.jp/cgi-bin/beerlist.cgi?brewery=Hoegaarden のような形ですね。 (beerlist.cgi は実際には以下略。 )
- hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty (3. Syntax Components)
-
relative-part は URI や absolute-URI に含まれ、後に羅列するパス群のうち、 path-noscheme を除いたもので構成されます。
- URI-reference = URI / relative-ref (4.1. URI Reference)
-
URI-reference is used to denote the most common usage of a resource identifier.
と、リソースの識別子を指示するために使用されることを示しています。URI 形式 (scheme ":" hier-part [ "?" query ] [ "#" fragment ]) または relative-ref 形式 (relative-part [ "?" query ] [ "#" fragment ]) のいずれかの形式となります。 http://hxxk.jp/cgi-bin/beerlist.cgi?brewery=Hoegaarden#White のような形で示したり、 /cgi-bin/beerlist.cgi?brewery=Hoegaarden#White のような形で示したり、 ./beerlist.cgi?brewery=Hoegaarden#White のような形で示したりします。 要するに、皆さんが普段 a 要素の href 属性や img 要素の src 属性に記述している値はこの URI-reference なのです。
- relative-ref (4.2. Relative Reference)
-
relative-ref = relative-part [ "?" query ] [ "#" fragment ]
という形式で、 http などのスキーム名は含まず、クエリ、フラグメントを含みます。 同一ホスト内でのリンクを示す場合に使います。 - relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty (4.2. Relative Reference )
-
relative-part は relative-ref に含まれ、次に羅列するパス群のうち、 path-rootless を除いたもので構成されます。
- path = path-abempty / path-absolute / path-noscheme / path-rootless / path-empty (3.3. Path)
-
パス群。 次項からそれぞれ解説しています。
- path-abempty = *( "/" segment ) ; begins with "/" or is empty
-
/ で始まるパスか、または空文字列から始まるパス。 パスは URI の末尾か、あるいは ? か # が最初に現れた時点で終わりとみなされますので、クエリやフラグメントは含みません。
/cgi-bin/beerlist.cgi あるいは beerlist.cgi のような形ですね。
- path-absolute = "/" [ segment-nz *( "/" segment ) ] ; begins with "/" but not "//"
-
/ で始まるが、 // では始まらないパス。 // は authority component に先行する部分で、かつ authority component の末尾は次の / が現れるか、 URI の末尾あるいは ? か # が現れる時点までですので、 authority component の直後から開始されるパス、と考えれば良いでしょう。
/cgi-bin/beerlist.cgi のような形ですね。
- path-noscheme = segment-nz-nc *( "/" segment ) ; begins with a non-colon segment
-
segment で始まるパス ( ただし、 : を含まない ) 。 segment-nz-nc は 1*( unreserved / pct-encoded / sub-delims / "@" ) とされており、pchar のうち、 : を除いたものでかつ長さが 0 ではないものということになります。
- path-rootless = segment-nz *( "/" segment ) ; begins with a segment
-
segment で始まるパス。 segment-nz は 1*pchar とされており、長さが 0 ではない pchar ということになります。
- path-empty = 0<pchar> ; zero characters
-
空文字列のパス。 path-empty は 0<pchar> とされており、長さが 0 の pchar ということになります。
こういうものも定義する必要があるのかなあ ? と思いましたが、例えば最初の段落の
<a href="#sub-20070105-03">http://hxxk.jp/2006/12/28/0223 のリライト部分</a>のようないわゆるページ内リンク ( フラグメントだけを記述したリンク ) は path-empty [ "#" fragment ] という形式の relative-ref だなあと一人ボケツッコミ。
http://hxxk.jp/2006/12/28/0223 をリライト
ということで、半ばメモ的に書いていた http://hxxk.jp/2006/12/28/0223 の内容をもう一度、正しい用語で書き直してみました。
同一ドメイン内でのリンクは URI 形式 ( おおざっぱに言うと http:// で始まるリンク ) だけでなく、相対参照 ( おおざっぱに言うと http:// で始まるリンク以外 ) も指定できるので、記述方法をおさらいしつつ自分メモ。 なお、「この記事中にて~」という記述は、単独表示の場合を想定しています。 2007 年 01 月の全文表示アーカイブにてこの記事をご覧になっている方は、お手数ですが http://hxxk.jp/2007/01/05/1930 を単独ページ表示してください。
- 現在のディレクトリまたは下位のディレクトリを示すリンク
-
現在のディレクトリを基準としたリンク。 ディレクトリを示さずにリソース名を指定するか、
./の後にリソース名を指定します。 例えばこの記事中にて<a href="./">hoge</a>や<a href="index">hoge</a>というリンクを書くと、 http://hxxk.jp/2007/01/05/ へのリンクになります。現在のディレクトリより下位のリンクを示すこともできます。 例えば、この記事の上のディレクトリである http://hxxk.jp/2007/01/ からこの記事へのリンクを行う場合、
<a href="./05/1930">hoge</a>や<a href="05/1930">hoge</a>という指定になります。 - 現在のディレクトリの上位ディレクトリを示すリンク
-
現在のディレクトリより上位のディレクトリを示すリンクは、
../で示します。../を 1 つ書くことで、 1 つ上位のディレクトリを示します。例えばこの記事中にて
<a href="../">hoge</a>というリンクを書くと、 http://hxxk.jp/2007/01/ へのリンクになります。更に
<a href="../../">hoge</a>のように../を増やすことで、より上のディレクトリへのリンクになります。 この場合は http://hxxk.jp/2007/ へのリンクになります。 - ルートディレクトリを示すリンク ( 絶対パスによる相対参照 )
-
現在のホストのルートディレクトリへのリンク。 path-absolute を用います。 例えばこの記事中にて
<a href="/">hoge</a>というリンクを書くと、 http://hxxk.jp/ へのリンクになります。 深い下位ディレクトリから、より上位のディレクトリにリンクを行う場合、あるいは同じ階層レベル付近にあるディレクトリへのリンクを行う場合は、この path-absolute を用いる方が分かりやすいと思います。例えば、 hxxk.jp のトップへリンクを行いたい場合に
../を用いると、<a href="../../../">hoge</a>という指定になりますし、 1 つ前の記事である <a href="./"> と <a href="/"> はどう違う ? へのリンクを行いたい場合は<a href="../../../2006/12/28/0223">hoge</a>という、「いったんルートディレクトリまで 3 階層遡って (../../../) 、その後 2006 年ディレクトリ→ 12 月ディレクトリ→ 28 日ディレクトリへ下がっていく (2006/12/28/) 」指定になります。ディレクトリ構造を完全に把握していればその指定でも構いませんが、 Movable Type の月別アーカイブのように、同じ記事の内容が単独記事よりも上位のディレクトリにも存在するといった場合には、
../を用いて共通のターゲットへの相対参照を行うことはできません。
Movable Type のような weblog ツールを独自ドメインで運用している場合は、 path-absolute を用いたリンクを行えば、どのディレクトリからのリンクでも共通のターゲットを示すことができますし、万一ドメインの変更を行った場合でもリンクの書き換えをしなくて済むのでお勧めです。
なお、レンタル weblog の場合や、共有ドメインで weblog ツールを運用している場合は、 path-absolute などの相対参照を用いるよりも URI 形式でリンクを行った方が良いと思います。 各種 weblog の URI 設計を比較してみるで以前調べたように、レンタル weblog の場合はドメイン以下にアカウント名のディレクトリを作成していることが多いので、 path-absolute の恩恵はあまり無いかなと。 レンタル weblog を乗り換える際に、同じようなディレクトリ構造のサービスを選び、かつ同じアカウント名を取得できるならその恩恵に預かれるかもしれませんが。
コメントレス
- はてなブックマーク - mintanのブックマーク / 2006年12月28日
-
ホントどーでもいいけどparentのローマ字読みが気になる。
とのことですが、ずっと「パレント」って読んでいました。 <MTHasParentCategory> テンプレートタグも「エムティハズパレントカテゴリ」のように。 もしかして、私が「トランスパレント」と読んでいる transparent も「トランスペアレント」がより正確な発音に近いんでしょうか……。 「ぶるーとらんすぱれんしー♪」というサビの某歌の影響かも…… ? - はてなブックマーク - 徒栞 / 2006年12月28日
-
「http:// で始まるリンク」は「絶対URI (absolute URI)」では。スキーム名が付いているので「完全パス」はちょっと違うと思います。
とのことですが、「完全パス」ってどこから出してきた名前なのか、今となっては自分でも分かりません。 absolute-URI は http:// などのスキームで始まるものですが、フラグメントを含まないんですよね。 URI とだけ書けば良かったみたいです。
実は一言メモでも終わる話
ちなみに、このネタを書こうと思ったきっかけは、 miniturbo::blog EZWebでの文字コードにて miniturbo.org のロゴをクリックしたら、 http://miniturbo.org/blog/2006/12/26/ にリンクされていて 403 Forbidden を食らったがために
「これって
<h1><a href="./" title="miniturbo.org"><$MTBlogName$> <$MTEntryTitle$></a></h1>
じゃなくて
<h1><a href="/" title="miniturbo.org"><$MTBlogName$> <$MTEntryTitle$></a></h1>
って書いた方が良いなあ」
と思ったことによります。
これだけの事をここまで膨らませるスキルよりも、冗長になりがちな説明を 1 パラグラフくらいでスッキリ解説できるようなスキルを今年は身に付けたい……。
で、最後に間違ったことを書いていないか検索しつつ読み直していたら、絶対 URI, 絶対パス < 02 < September < 2006 < nulog, NULL::something : out of the headphone に分かりやすくかつ正確にまとまっているのを発見。 適当なことをメモ書きする前にしゅがたん (nulog / nulog, NULL::something : out of the washer の cho45 さんのこと ) に尋ねておけば良かった…… ! いや他人に教えてもらうより自分で調べた方が理解は深まりますよね ?

