Apache | コンテンツの配置 | ディレクトリインデックス(DirectoryIndex)

Apacheでは、ファイルへアクセスするときにディレクトリだけが指定された場合、デフォルトで返すファイルをDirectoryIndexで指定する。

ディレクトリインデックス(DirectoryIndex)

クライアントからの要求で、ファイル名を指定せずディレクトリだけが指定される場合がある。ファイル名が省略された場合にどのファイルを返すかをDirectoryIndexで指定する。

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

ファイル名は1つ以上指定できる。

httpd.confファイルでDirectoryIndexを検索すると、次のような内容が見つかる。

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

デフォルト設定ではindex.htmlが指定されている。そのため、クライアントからhttp://localhost/を要求すると、実際にはhttp://localhost/index.htmlが存在するかを確認し、存在する場合はそのファイルを送信する。

ディレクトリインデックスには複数のファイルを指定できる。ファイルは空白で区切って続けて記述する。複数のファイルを記述した場合、先頭から順番にファイルが存在するか確認し、存在するファイルを表示する。

DirectoryIndex index.html index.htm index.php

この場合、index.htmlindex.htmindex.phpを順番に検索し、見つかったファイルをクライアントへ返す。

実習

では、次のような簡単なHTMLファイルを作成し、ドキュメントルートディレクトリに置いてみる。

hello.html

<html>
<head><title>Apache</title></head>
<body>
<h1>Hello World devkuma!</h1>
</body>
</html>

そしてDirectoryIndexを次のように記述する。すでにApacheが起動している場合は、変更内容を反映するために再起動する必要がある。

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

ブラウザを起動し、次のURLにアクセスする。

http://localhost/

DirectoryIndexhello.htmlファイルが最初に書かれているため、ディレクトリだけを指定したときに最初にhello.htmlを検索し、ファイルが存在するのでそのファイルが表示された。

次に、DirectoryIndexはそのままにして、hello.htmlをドキュメントルートから別の場所へ移動する。ドキュメントルート(\htdocs)にbakディレクトリを作成し、そこへ移動する。そして再びブラウザでhttp://localhost/にアクセスする。

この場合、まずhello.htmlを探すが、ファイルが存在しないため次の候補であるindex.htmlを探す。そしてindex.htmlが存在するため、ファイルの内容をクライアントへ返す。

さらに、DirectoryIndexはそのままにして、index.htmlもドキュメントルートから別の場所へ移動する。このファイルもbakディレクトリへ移動する。そして再びブラウザでhttp://localhost/にアクセスする。

DirectoryIndexに指定されたファイルがすべて見つからない場合、そのディレクトリに含まれるファイルとディレクトリの一覧が表示される。ただし、ファイル一覧が表示されることはセキュリティ上の問題にもなるため、一般的にはファイル一覧が表示されないように設定しておくのがよい。設定方法は別のページで確認する。