DirectoryIndexディレクティブ:ディレクトリへのリクエストに対してどのファイルを返すのか

DirectoryIndex ディレクティブは、ブラウザから Apache へディレクトリへのリクエスト(例えば http://www.example.com/sub/ などのようなリクエスト)があった場合にどのファイルを返すのかを設定するときに使用します。ここでは Apache の DirectoryIndex ディレクティブの使い方について解説します。

(Last modified: )

DirectoryIndexディレクティブの使い方

DirectoryIndex ディレクティブはクライアントからのリクエストが最後が「/」で終るディレクトリだった場合にどのファイルをクライアントへ返すのかを設定する場合に使います。書式は次のとおりです。

DirectoryIndex ファイル名 [ファイル名 [...]]

記述できる場所は httpd.conf, VirtualHost, Directory, .htaccess です。 .htaccess で設定する場合は AllowOverride Indexes が設定されている必要があります。

ファイル名は1つまたは複数指定することが可能です。例えばリクエストがディレクトリだった場合、そのディレクトリに含まれる index.html ファイルを返す場合には次のように記述します。

DirectoryIndex index.html

このように設定されている場合、例えば http://www.example.com/ へリクエストがあったときに http://www.example.com/index.html が存在するか調べ、存在した場合はクライアントへ返します。

DirectoryIndex ディレクティブには複数のファイル名を指定できます。複数指定する場合はスペースで区切って続けて記述してください。

DirectoryIndex index.html index.php index.htm

複数記述した場合、記述された順番にファイルが存在するかどうかを調べ、存在したファイルが見つかればそのファイルを返します。上記の場合は先に index.html を探し、見つからなかった場合は index.php を探し、最後に index.htm を探します。

リクエストがあったディレクトリとは別のディレクトリに含まれるファイルを返すこともできます。その場合はドキュメントルートからのパス付きでファイルを指定します。

DirectoryIndex index.html index.php /sub/sorry.html

上記の場合は、リクエストのあったディレクトリに index.html 、 index.php と順にファイルを探し、どちらも見つからなかった場合は /sub/sorry.html ファイルをクライアントへ返します。

httpd.conファイルでの記述

httpd.conf ファイルにはデフォルトで次のように記述されています。

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
  DirectoryIndex index.html
</IfModule>

DirectoryIndex ディレクティブに対して index.html が設定されています。この設定は dir_module モジュールが使用可能になっている場合に有効です。

それでは次のように変更してみます。

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
  DirectoryIndex index.html hello.html
</IfModule>

次にドキュメントルートに index.html と hello.html ファイルをそれぞれ設置します。

DirectoryIndexディレクティブの使い方(1)

それではブラウザから http://localhost/ へアクセスしてください。次のように表示されます。

DirectoryIndexディレクティブの使い方(2)

DirectoryIndex ディレクティブの最初に記述してある index.html が存在しているので、 index.html ファイルがブラウザに返されて表示されました。

ではドキュメントルートから index.html を削除してください。

DirectoryIndexディレクティブの使い方(3)

あらためてブラウザから http://localhost/ へアクセスしてください。次のように表示されます。

DirectoryIndexディレクティブの使い方(4)

DirectoryIndex ディレクティブの最初に記述してある index.html が見つからなかったので次に記述してある hello.html を探します。そして hello.html が存在しているので hello.html ファイルがブラウザに返されて表示されました。

このようにブラウザからのリクエストの最後が「/」だった場合、 DirectoryIndex ディレクティブに記述されているファイル名を順に探し、見つかった場合はブラウザにそのファイルを返します。

DirectoryIndexディレクティブで指定したファイルが存在しない場合

DirectoryIndex ディレクティブで設定したファイルがリクエストのあったディレクトリにひとつも存在しない場合、 Option ディレクティブで Indexes が有効になっているかどうかで次のいずれかのデータがクライアントへ返されます。

※ Option ディレクティブについて詳しくは「Optionsディレクティブ:ディレクトリで使用可能な機能を設定する」を参照されてください。

OptionディレクティブでIndexesが有効になっている場合

Option ディレクティブで Indexes が有効になっている場合はディレクトリ内のファイルやサブディレクトリの一覧をクライアントへ返します。

httpd.conf ファイルにはデフォルトで次のように記載があり Indexes が有効となっています。

<Directory "${SRVROOT}/htdocs">
    Options Indexes FollowSymLinks
</Directory>

それではドキュメントルートの中に DirectoryIndex ディレクティブで設定したファイルが対象のディレクトリの中に一つもない状態で、ブラウザから http://localhost/ へアクセスしてください。次のように表示されます。

DirectoryIndexディレクティブで指定したファイルが存在しない場合(1)

ドキュメントルートの中にあるファイルの一覧が表示されました。

OptionディレクティブでIndexesが有効になっていない場合

次に Option ディレクティブで Indexes が有効になっていない場合、リクエストのあったディレクトリは存在するけれど DirectoryIndex ディレクティブで設定したファイルがひとつも存在しない場合はエラー画面が表示されます。

実際に試してみます。 httpd.conf ファイルを次のように修正し Indexes が有効とならないように変更します。

<Directory "${SRVROOT}/htdocs">
    Options FollowSymLinks
</Directory>

それではドキュメントルートの中に DirectoryIndex ディレクティブで設定したファイルが対象のディレクトリの中に一つもない状態で、ブラウザから http://localhost/ へアクセスしてください。次のようにエラーが表示されます。

DirectoryIndexディレクティブで指定したファイルが存在しない場合(2)

ディレクトリが存在しない場合

なおディレクトリのリクエストがあった場合に、そのディレクトリが存在しないものだった場合には Option ディレクティブで Indexes が有効になっているかどうかに関わらず 404 Not Found となります。

DirectoryIndexディレクティブで指定したファイルが存在しない場合(3)

-- --

Apache の DirectoryIndex ディレクティブを使い、ディレクトリへのリクエストがあった場合にどのファイルを返すのかを設定する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。