2005-07-17

Operaの相対URIの解決方法に疑問

私が愛用するブラウザは、勿論 Mozilla Suite日本語版)なのだが、最近のOperaの動向が何と無く気になったので、Operaのサイトにアクセスしてみた。

ところで、Operaといえば、Mozillaと同様に各種ウェブ標準仕様への高い準拠性と高速なレタリングエンジンを搭載していることで知られているが、現在最新版となる Opera 8 が公開されている。

さて、久々にOperaを導入して早速使用してみたのだが、Operaの相対URIの解決方法に疑問を抱いた。

HTML 4.01 SpecificationResolving relative URIs [引用: http://www.w3.org/TR/1999/REC-html401-19991224/struct/links.html#resolving-relative-uris より] には、相対URIの解決方法について次の様に記されている。

User agents must calculate the base URI for resolving relative URIs according to [RFC1808], section 3. The following describes how [RFC1808] applies specifically to HTML.

User agents must calculate the base URI according to the following precedences (highest priority to lowest):

  1. The base URI is set by the BASE element.
  2. The base URI is given by meta data discovered during a protocol interaction, such as an HTTP header (see [RFC2616]).
  3. By default, the base URI is that of the current document. Not all HTML documents have a base URI (e.g., a valid HTML document may appear in an email and may not be designated by a URI). Such HTML documents are considered erroneous if they contain relative URIs and rely on a default base URI.

[引用: 12.4.1 Resolving relative URIs -- HTML 4.01 Specification より]

つまり、基本URIhttp://a/b/c/d である文書の文脈中に提示されるリンクが「#」記号に続くアンカー名(部分識別子)、例えば #s のみの場合(リンクが同じ文書内にある場合)の絶対URIは、http://a/b/c/d#s と解決される。

ところがOpera(以前のバージョンでも同様)の場合、コンテントネゴシエーションやURIの最後に「/」を指定してディレクトリインデックス(例えばApachサーバのDirectoryIndexで指定された資源)を要求した場合の基本URIが上記引用の優先順位2を基に判定した基本URIは、前者ならばMIMEタイプ拡張子及び言語拡張子、後者ならばファイル名称を含む基本URIとして相対URIの解決を行っている。

これを分かり易く解説すると、例えば、http://a/b/c/d というURIがコンテントネゴシエーションにより複数の媒体型や言語の資源を提供しているような時、例えばapplication/xhtml+xml媒体型のXHTMLを要求した場合、前述した相対URIは http://a/b/c/d.xhtml#s として解決される。また、http://a/b/c/d というURIがディレクトリインデックス指定と一致する e.xhtml というファイルを受け取る場合には、http://a/b/c/d/e.xhtml#s と解決されるのである(Mozillaでは要求したURIと等しい)。

この資源のURI http://purl.org/net/osamurai/weblog/2005/07/17 は、ネゴシエーションにより一致するサーバ上の唯一のファイル 17.xml をサーバサイドXSLTによりHTMLなどに変換して提供している訳ですが、OperaではこのURIの基本URIを http://purl.org/net/osamurai/weblog/2005/07/17.xml と判定してしまことで、要求したURIと基本URIが異なる為にリンクが同じ文書内にある場合に問題が生じてしまうのです。本サイトを訪れているOperaユーザが微小ながら増加傾向にあるだけに、このまま見過ごせないというわけなのです。

以上のようにOperaの基本URIの解決方法に疑問を持ってならない。この解釈方法では、本サイトの事例の様に様々な弊害もあり得る訳なのだし・・・。一先ず本サイトではその対処として、Operaに限りbase要素を出力に含めるようにXSLファイルを修正しました。

追記

本記事の内容を鵜呑みにしないでください。後日、私がうっかりしていたことに気付いたので、改めて相対URIの解決方法について掲載致しました。