ディレクトリインデックス制御

Updated / Published

ファイル名が指定されずにディレクトリだけのURIでリクエストされる場合があります。たとえば、http://www.hoge.hoge/etc/ のようにURIの最後にスラッシュ(/)がある URI にアクセスすると、"etc" のディレクトリにある index.html のファイルが呼び出され、http://www.hoge.hoge/etc/index.html を自動的に参照していることがあります。

これはウェブサーバの管理者が記述した主設定ファイルの httpd.conf によって、予めスラッシュ(/)で終わる URI にアクセスがあった場合に、index.html のファイルを代替して呼び出すように設定されているからです。この設定は、DirectoryIndexディレクティブを使って、どのファイルを代替で呼び出すかを変更できます。

ディレクトリインデックスファイルの設定

DirectoryIndex top.html

DirectoryIndexディレクティブは、スラッシュ(/)で終わる URIにアクセスがあった場合に代替して呼び出すディレクトリインデックスファイルを指定します。上記の場合、スラッシュ(/)で終わる URI へアクセスした場合に最初に呼び出されるファイルは自動的に top.html になり、そのディレクトリに index.html のファイルがあっても、これは代替して呼び出されるファイルとして定義されているファイルではないため、index.html を参照するためには、直接 index.html の URI を指定してファイルにアクセスする必要があります。

ディレクトリインデックスファイルの複数指定

半角スペースをあけて複数記述することで、代替して呼び出すファイルの順番を指定することができます。

DirectoryIndex index.html index.htm index.shtml index.cgi index.php

この例ではスラッシュ(/)で終わる URI にアクセスがあった場合、サーバは index.html がなければ index.htm を代替に、index.htm がなければ index.shtml を代替に、index.shtml がなければ index.cgi を代替に、index.cgi がなければ index.php を代替に順に呼び出すという設定でスラッシュ(/)で終わる URI にアクセスがあった場合に呼び出すファイルを指定しています。

インデックス表示を禁止する

代替として呼び出し指定されたファイルがすべて見つからなかった場合、Apache では下記のようなディレクトリに置かれているファイルの一覧を表示します。

Apache でのディレクトリ一覧表示例

これは Apache 特有の機能で DirectoryIndexディレクティブで指定されたファイルがどれも見つからなかった場合に、上記のようなファイルの一覧(インデックス)を表示します。ここには、そのディレクトリに置いてあるすべてのファイルが表示されてしまうため、不用意に覗かれることはセキュリティ上好ましくないのでインデックスが表示されるのは避けるようにした方が無難です。そこで、DirectoryIndexディレクティブで複数指定されているすべての URI がどれも見つからなかった場合は、403 Forbidden(閲覧禁止)を表すステータスコードを返すように設定しておいた方が安全です。

まず、指定されたファイルが見つからなかった場合に、ファイルの一覧(インデックス)が表示されるのは、Optionsディレクティブによりインデックスの閲覧が許可されているためです。この閲覧を禁止設定にする必要があります。

Options -Indexes

Optionsディレクティブに -Indexes の値を指定することにより、インデックスの閲覧を禁止し、403 Forbiddenステータスコードを返すようになります。Optionsディレクティブは、許可するディレクトリオプションを指定するもので、値の Indexes はスラッシュ(/)で終わるディレクトリへリクエストがあった際にデフォルトで表示するように指定されたファイルが見つからなかった場合にディレクトリのファイル一覧を表示する命令です。この Indexes に "+" か "-" の記号を前置することで標準からの差分を設定することができます。