設定の有効範囲を指定(セクションコンテナ)

広告

「httpd.conf」ファイルを見て頂くと次のような記述があることが分かります。

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

<Directory "C:/pg/Apache/Apache2.2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<FilesMatch "^¥.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

同じような設定が繰り返し行われています。実際には設定が影響する範囲を指定し、その範囲毎に設定を行っています。この範囲を指定するための記述をセクションコンテナと言い<Directory>などを使って記述します。

影響範囲の指定は、(1)ディレクトリ単位で指定する方法、(2)ファイル単位で指定する方法、(3)URLのパス名単位で指定する方法、の3通りで指定することが出来ます。例えばあるディレクトリに含まれるファイルを閲覧するには認証が必要なように設定するといった利用方法が行えます。

簡単に記述方法を見ていきます。

ディレクトリ単位での指定

ディレクトリ単位で範囲を指定する場合にはセクションコンテナとして「<Directory>」を使います。

<Directory パス名>
    ...
    設定ディレクティブ
    ...
</Directory>

ディレクトリを表すパスはフルパスで指定します。Windowsの場合はドライブからの指定になります。「*」や「?」などのワイルドカードを使った指定も可能です。

<Directory />
    ...
</Directory>


<Directory "C:/pg/Apache/Apache2.2/htdocs">
    ...
</Directory>

上記の場合はパス名として「/」と「C:/pg/Apache/Apache2.2/htdocs」の2つが指定されています。ディレクトリで指定する場合は、指定したディレクトリとそのディレクトリに含まれる全てのサブディレクトリ全体が含まれます。「C:/pg/Apache/Apache2.2/htdocs」と指定した場合には、このディレクトリの配下にある全てのファイルとサブディレクトリ全てが対象となります。

パス名「/」と書かれている部分は特別です。先ほど記述した通りディレクトリで指定した場合には全てのサブディレクトリが対象となります。「/」はルートディレクトリを表しますのでパス名「/」で指定した場合には全てのファイルが対象となります。つまりここで記述された設定は個別に設定がされない全てのディレクトリのデフォルトの設定になるわけです。

個別のディレクトリに対して設定を記述し、さらにそのサブディレクトリの対して個別の設定を行うことも可能です。この場合2つの設定(正確にはルートに対する設定も含めると3つの設定)が対象のディレクトリに対して記述されることになりますが、ディレクトリで指定する場合にはルートからの長さが短い順(パス名が短い順)に適用され、同じ設定項目に関する設定は上書きされていきます。

ファイル単位での指定

ファイル単位で範囲を指定する場合にはセクションコンテナとして「<Files>」を使います。

<Files ファイル名>
    ...
    設定ディレクティブ
    ...
</Files>

ファイル名で指定する場合は、そのファイルが存在するディレクトリに関係無く特定のファイル名のファイルや特定の拡張子を持つファイル全般に設定を行いたい場合に利用すると便利です。ファイル名でも「*」や「?」などのワイルドカードを使った指定も可能です。

「httpd.conf」ファイルに記述された例を見てみると次のように記述されています。

<FilesMatch "^¥.ht">
    ...
</FilesMatch>

「FilesMatch」は「Files」でファイル名に正規表現を使いたい場合に使用します。ファイル名として「^¥.ht」と記述されていますが、これは正規表現で記述されておりこの正規表現にマッチするファイル名が全て対象となります。

ファイル名で範囲指定された設定が複数記述された場合、記述された順に設定が有効になっていきます。ディレクトリの場合はパス名が短い順でしたが、ファイル名の場合は記述された順に解釈されていく点に注意して下さい。

URLのパス単位での指定

URLのパス単位で範囲を指定する場合にはセクションコンテナとして「<Location>」を使います。

<Location URLパス名>
    ...
    設定ディレクティブ
    ...
</Location>

実際のファイルの存在場所とは違い、どのように呼び出されるのかのURLパス名(及びそのURLパス名で始まるURL全体)に対して設定が有効となります。パス名はURLの中で「http://ホスト名/aaa/bbb」の「/aaa/bbb」の部分を指定します。

<FilesMatch /aaa/bbb>
    ...
</FilesMatch>

「Location」はデータベースなどから動的にURLを作成する場合などに利用すると便利です。

実際の設定方法

3つのセクションコンテナが記述されている場合、「ディレクトリ名」「ファイル名」「URLパス名」の順番に設定が解釈されていき、後の設定によって上書きされていきます。

それに対して「Location」の場合、実際のファイルに対する1つのアクセス記述方法であるURL表記に対して設定を記述しますが、あくまでファイルへのアクセスの仕方の記述方法に対する制限であって、実際のファイルに対する範囲設定ではありません。問題無い場合もありますが、存在しているファイルに対する設定は「Directory」と「Files」を使って記述するようにして下さい。

「Location」はデータベースなどから動的にURLを作成する場合などに利用すると便利です。

( Written by Tatsuo Ikura )