太古の <Limit>

…というほどおおげさなものではない。

いきなりこのページを読んでも何でこんなことを調査してるのかわけわからんと思うので、先に<Limit> は使うなというページに目を通しておいてくださいませ。


Apache 以前の Web サーバ

Yahoo! や asahi.com が10年を越えたそうで。

WWW の現在の隆盛は国内のほとんどの Web サイトが www.ntt.jp からのリンクで飛べたあの時代からは隔世の感がある。現在の Web サーバのシェアは Apache と IIS が大多数を占めるが、あの当時、Web サーバのシェアは WWW を発明し、当然世界最初の Web サーバの開発元でもある CERN によるものと、あの Mosaic を開発した NCSA によるもので二分されていた。

その二大巨頭に殴りこみをかけたのが Apache である。とはいえ、Apache はゼロから作りだされたものではなく、既存の Web サーバへのパッチとして開発が始まったものである。そもそも Apache という名前自体が a patchy server(パッチだらけのサーバ)から来たものである。そのパッチを当てる対象だったのが二大巨頭の一方の雄 NCSA HTTPd のバージョン 1.3 だった。

NCSA HTTPd のドキュメントを読んでみる

Apache の出自は NCSA HTTPd なので、設定ファイルは両者よく似ている。これはドキュメントを読んでみればよくわかる。Apache でおなじみのディレクティブがずらりと並んでいるので、はじめて NCSA HTTPd のドキュメントを見る人でもどう設定すればいいのかはすぐにつかめると思う(もちろん、Apache の方が後発なので順序が逆なのであるが)。Apache2 になった今でも、httpd-std.conf の冒頭に ``Based upon the NCSA server configuration files'' とあるぐらいだ。現在の Apache とは異なり httpd.conf と mime.types というふたつの設定ファイル以外に srm.conf や access.conf といった設定ファイルを使うが、実は Apache も 1.3 の途中まで(1.3.4だったかな?)は同じようにこれらの設定ファイルを使う方式を踏襲していたし、必要のなくなった今でも 1.3 系では中身が空っぽのファイルが conf/ の下に置かれるのはご存知のとおりである。

さて、気になる <Limit> も、もちろん NCSA HTTPd から存在しているディレクティブである。これは4つの設定ファイルのうち、access.conf (と、.htaccess)の中で使われるディレクティブである。ドキュメントを読んでみよう

Purpose
Limit is a sectioning directive which controls which clients can access a directory.

あれ?と思った人は鋭い。Apache の場合はこんな感じ(比較のためあえて日本語ではなく英語ドキュメントを引用)。

The purpose of the <Limit> directive is to restrict the effect of the access controls to the nominated HTTP methods.

NCSA HTTPd の Limit では単にアクセス制限のための sectioning directive となっている。しかし、Apache の方はメソッドを限定する、という文言になっている。

指定されたメソッドにしかディレクティブの効果が及ばないというのは NCSA でも Apache でも同じである。しかし、大きく違うのは、以下の点である。order のドキュメントから。

Purpose
The order directive affects the order in which deny and allow directives are evaluated within a Limit section.

Scope
This directive is only available within Limit sections.

その他、allowrequire なども同様の記述である。こういった実際にアクセス制限をおこなうディレクティブは NCSA HTTPd では Limit セクションの中にしか書けなかったのだ。Apache でもアクセス制限を何もないところにベタに書くことができないのは同様だが、Limit セクションではなく <Directory> などのセクション内であって、<Limit> ではない。

つまり、NCSA HTTPd では Apache とは異なり、アクセス制限をするためには <Limit> は必須だったのだ。

<Limit GET>
order deny,allow
deny from all
allow from .ncsa.uiuc.edu
</Limit>

この設定から <Limit> をとっぱらっても Apache では正常に動く。なぜならば、Apache では <Limit> はメソッドを限定するためものであって、限定する必要がないのならばなくてもかまわないものだから。しかし、NCSA HTTPd で <Limit> は必須である。とっぱらうとエラーになる。なぜならば、セクションが明示されないから。NCSA HTTPd から Apache に進化する過程で、同じ名前のディレクティブが異なる動作を意味するように変更されたわけである。

大昔の Apache

それでは、NCSA HTTPd の <Limit> が Apache でいつ意味が変わっていったのかさかのぼってみよう。

Apache の公式サイトからダウンロードできるものは2005年3月現在、1.2.6 が最古のバージョンである。しかし、これは NCSA や CERN の HTTPd をほぼ駆逐完了した時期に出た比較的最近のものであり、<Limit> の意味は現在の Apache と同じである。

もっとさかのぼると、Apache 1.0 以前のソースを発見した。この古いソースを眺めてみたところ、95年8月の Apache 0.8.8 では現在と同様の動作だが、95年5月の 0.6.5 では NCSA HTTPd と同様に <Limit> の中だけに限定されている(ように見える。C を読めないので確証はない)。この間に入った変更のようだ。

現在配布されている Apache の CHANGES を見ると、0.7.3(95/6/20) と 0.8.0(95/7/16) の間のわずか1ヶ月間(公式サイトの記述では5月から6月となっている)だけ Apache ではなく Shambhala というコードネームで開発され、この期間で HTTPd としてのコアの機能が一新されていることが読み取れる。<Limit> に関する仕様変更もこの Shambhala の開発でおこなわれたのだろう。CHANGES に出てくる最初のバージョンである Apache 0.2 は 95/3/18 なので、Apache の <Limit> の意味が NCSA HTTPd と同じだったのは開発初期のわずか数ヶ月間だけだったということになる。

しぶとく生き残る <Limit>

Apache はその後、95年11月に 1.0.0 がリリースされた。当然、そのドキュメントからは、Limit や require などのディレクティブの説明はすでに現在の Apache と同じような意味を持ち、NCSA とは似ているが違うことが読み取れる。もちろん、ドキュメントだけでなく実運用でも <Limit> は用済みになったはずなのだが、しかしそれが消えることはなかった。

Apache と NCSA HTTPd は設定ファイルの記述がそっくりなので古い知識でそのまま移行してしまったというのはたしかにあるかもしれない。しかし、NCSA からの移行ではなく Apache が初めて、あるいは CERN httpd やその他からの移行ならば NCSA HTTPd についての前知識なんてものは不要だったはずなのに。

Limit の話ドキュメントを読まない人の話で書いたように、Apache を使っているのに、Apache でないものを前提した例を猿マネして、それが10年の長きにわたって延々と繰り返されて NCSA HTTPd でしか通用しない知識が今でも再生産され続けている。

この文章を書いている今は2005年。Apache 1.0.0 から10年、元祖 NCSA HTTPd の最終版 1.5.2a から9年もたっている。いいかげん、古い知識は捨てませんか?

おまけ

せっかくなので、このページを書くのに使った資料のひとつである Apache 1.0.0 のドキュメント(PDF 440KB)を置いときます。この Postscript ファイルを MacOSX の Preview.app で PDF に変換したもの。


もどる
<y@maya.st>