HTML の base 要素の起源に迫ってみた

HTML の base 要素の起源に迫ってみた

HTML には base という要素があって、その文書中の URL の解決に用いられる基底 URL を指定することができます。例えば、

<base href="http://www.example.com/hoge/fuga/">

<a href="../abc/def">/hoge/abc/def</a>

という HTML だと、 a 要素のリンク先は http://www.example.com/hoge/abc/def になります。

さて、 base 要素には

http://www.whatwg.org/specs/web-apps/current-work/#the-base-element

A base element, if it has an href attribute, must come before any other elements in the tree that have attributes defined as taking URLs, except the html element (its manifest attribute isn't affected by base elements).

base 要素は、 href 属性を持つ場合には、当該木上にあって URL を取る属性を持つ他の要素よりも前に来なければなりません。ただし html 要素を除きます (manifest 属性は base 要素の影響を受けません)。

との規定があります。相対 URL を解決する必要が生じるよりも前に基底 URL が与えられるべきというのは納得感ありますが、それなら最初から単独の要素にせずに、 html 要素の属性にでもしておけば良さそうなものですよね。

でもそうなっていない理由として考えられるのは、 base 要素が作られたのが html 要素や head 要素の存在しない (か両タグを明記しないのが一般的だった) 時代 (1990年から1993年くらいです。) だったから、といったところでしょうか。 (あるいは、そのような時代に作られた title 要素や nextid 要素のデザインパターンを踏襲したというのも考えられます。) じゃあ base 要素は一体いつ HTML に追加されたのでしょうか。

IETF

初期の HTML は IETF で標準化作業が行われていました。まずはその頃の HTML 仕様を調べてみます。

IETF で最初の正式な HTML 仕様は 1995年11月の RFC 1866http://tools.ietf.org/html/rfc1866 (HTML 2.0) です。 base 要素はこの時既に HTML に含まれており、 target 属性がまだないことを除けば (base 要素に target 属性が追加されたのは1995年の Netscape Navigator 2、あるいは1998年の HTML4 です。)、 ほぼ現在と同じ定義となっていますhttp://tools.ietf.org/html/rfc1866#section-5.2.2

それよりも前の、現在では HTML 1.0 と呼ばれている1993年6月の Internet Draft draft-ietf-iiir-htmlhttp://tools.ietf.org/html/draft-ietf-iiir-html が IETF では一番古い HTML 仕様ですが、ここでも HTML 2.0 と同様の規定となっています。

HTML 1.0 Internet Draft に既に含まれているなら、もっと前から存在していそうです。先に実装されて後から仕様に取り込まれることもよくありますから、いつから実装されているのかも調べてみましょう。

実装

初期の HTML のリファレンス実装とでも言うべき libwww の改訂履歴http://www.w3.org/Library/User/History.htmlによると、 1994年3月25日の 2.15 で HTML+ の要素すべてを構文解析器レベルで実装したとのことで、base 要素も含まれていたhttp://www.w3.org/MarkUp/HTMLPlus/htmlplus_53.htmlとみられます。しかし1996年7月20日の Release 4.1b3 に base 要素を実装したとあり、それまでは機能していなかったと推測できます。1996年には HTML 2.0 RFC も Netscape Navigator も Internet Explorer も既に出てしまっています。

Netscape Navigator は 1.0 (1994年12月)、 Internet Explorer は 1.0 (1995年8月) の時点で base 要素に対応しているhttp://www.blooberry.com/indexdot/html/tagpages/b/base.htmようです。 NCSA Mosaic は 2.0 (1995年10月) からの対応で、それ以前は対応していなかったようです。 Lynx は 1995年1月22日に実装したhttp://lynx.isc.org/current/CHANGES2.4ようです。

まとめると base 要素は1994年から1995年にかけて Web ブラウザーに実装されたものであり、 HTML 1.0 Internet Draft よりは後ということになります。

もっと前

HTML 1.0 Internet Draft 以前の HTML 仕様書としては、当時 CERN の Web サイトにあったらしい HTML ファイルや html-spec.ps という名前で配布されたファイルが色々なところに残っています。1993年3月10日版の仕様書http://1997.webhistory.org/www.lists/www-talk.1993q1/0245.htmlとみられる1993年3月付けの html-spec.ps (それを PDF 化したものhttp://suika.suikawiki.org/www/2005/pre-id/html-spec-199303.pdf) には base 要素の定義が含まれています。また1993年1月6日付け html.dtd 1.3 が収録されており、そこにも base 要素が含まれています。これが現在確認されている中で base 要素の最古の定義です。 (ただし後述の通り1/6という日付は怪しいです。)

This element allows the URL of the document itself to be recorded in situations in which the document may be read out of context. URLs within the document may be in a "partial" form relative to this base address. Where the base address is not speci&#64257;ed, the reader will use the URL it used to access the document to resolve any relative URLs. The one attribute is:

HREF
the URL

Hypertext Markup Language http://suika.suikawiki.org/www/2005/pre-id/html-spec-199303.pdf

また、 W3C に 1992年から HTML 2.0 までの DTD の RCS ファイル html.dtd,vhttp://www.w3.org/MarkUp/html-spec/html.dtd,v があります。 base 要素が初めて登場する 1.6 は1993年6月の HTML 1.0 Internet Draft のものとされています。それより前の 1.5 はファイル中に1993年1月7日とあります。その更に前の 1.4 はファイル中に1993年1月20日とあり、 RCS ファイルとしてのタイムスタンプは1993年2月3日となっています。前述の3月10日の仕様書内の1月6日付けDTDも含め、この頃の DTD のタイムスタンプは混乱しているように見えます。この html.dtd,v 自体が1994年3月に作られたものであり、それ以前のタイムスタンプは信用しない方が良さそうです。

base 要素の定義として確実に遡れるのは1993年3月までですが、 base 要素に相当する概念への言及はもっと早くからありました。1991年10月の Tim Berners-Lee による HTML 仕様書についてのメールhttp://lists.w3.org/Archives/Public/www-talk/1991SepOct/0003.html (これが (base に限らず) HTML 仕様について具体的に言及している文書としては最古のものです。) には

The base address tag is not used

Re: status. Re: X11 BROWSER for WWW http://lists.w3.org/Archives/Public/www-talk/1991SepOct/0003.html

と述べられています。1992年11月時点で CERN の Web サイトにあったらしい Tim Berners-Lee の仕様書http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html (Wikipedia 英語版によるとhttp://en.wikipedia.org/wiki/HTML#HTML_draft_version_timeline1991年10月のもの) にも

The format of this tag is not yet specified. NOT CURRENTLY USED

HTML Tags http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html

base 要素に相当する構想が記述されています。具体的なタグ名はこの時点ではまだありません。

更に当時の将来の予定 (タイムスタンプは1992年12月)http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Future.html の中にも言及があり、1992年末には savedas という仮のタグ名が与えられていたようです。1993年1月14日http://1997.webhistory.org/www.lists/www-talk.1993q1/0070.htmlにもメールで savedas を仕様に追加するつもりとの言及があります。

ということは1993年1月14日から3月10日の間に savedasbase として HTML 仕様に追加されたということになりますが、残念ながら改称の経緯や2ヶ月のうちのいつ追加されたのかまではわかりませんでした。仮称である savedas が含まれている仕様書や DTD は見つかっていません。また1月21日付けの Dan Connolly の仕様書http://www.w3.org/History/1993/WWW/LibHTML/src/hypertext/にも <code>base</code> 要素はまだ含まれていませんでした。

まとめ

以上をまとめると、次のようになります。 base 要素は 1991年10月には既に構想があり、1993年3月までに HTML 仕様に追加されました。1994年から1995年にかけて Web ブラウザーに実装されました。