インデックスファイルの設定(indexディレクティブ)
Nginx の index ディレクティブは、リクエストの URL がスラッシュ(/)で終わるディレクトリを指定した場合に、そのディレクトリ内でどのファイルを返すかを設定するためのものです。ここでは Nginx における index ディレクティブの使い方について解説します。
indexディレクティブの書式
Nginx の index ディレクティブには、リクエストの URL がスラッシュ(/)で終わるディレクトリを指定した場合に、そのディレクトリ内でどのファイルを返すかを設定するためのものです。 index ディレクティブの書式は次の通りです。
Syntax: index file ...; Default: index index.html; Context: http, server, location
index ディレクティブは http、 server、 location コンテキスト内で使用できます。引数として、返すファイルを指定します。
URL がスラッシュ(/)で終わるリクエストは次のようなものです。
http://localhost/ http://localhost/document/
このようにディレクトリが指定された場合に、デフォルトで返すファイル名を指定します。
index ファイル名;
複数のファイルを指定することができます。複数のファイルを指定する場合は、半角スペースを空けて続けて記述してください。
index ファイル名A ファイル名B;
複数のファイルを指定した場合、左から順番にファイルを探します。ファイル名Aが存在すればファイル名Aを返し、ファイル名Aが存在しなかった場合にファイル名Bが存在すればファイル名Bを返します。
もし index ディレクティブに指定したファイルがすべて見つからない場合、エラーが返されます(autoindex ディレクティブの設定によっては、ディレクトリのファイル一覧が表示されます)。
indexディレクティブの設定例
index ディレクティブの設定例をいくつか見ていきます。
http {
server {
index index.html index.htm;
}
}
index に対して index.html と index.htm の 2 つのファイルを指定しています。ディレクトリへのアクセスがあった場合、左から順にファイルを探すのでまず index.html を探し、見つからなかった場合は index.htm を探します。
http {
server {
index index.html;
location / {
# ・・・
}
location /scripts/ {
index index.php index.html;
}
}
}
基本のインデックスファイルは server で設定した index.html ですが、リクエストのパスが /scripts/ とマッチする場合は index.php と index.html がインデックスファイルになります。
この例の場合、 2 つの location があり、最初の location では index ディレクティブが設定されていません。この場合は上位の server で設定したインデックスファイルが継承されます。
※ location コンテキストについては「リクエストされたURLのパスに応じて処理を分岐(locationコンテキスト)」を参照されてください。
ファイルが見つからなかった場合の設定
ディレクトリへのリクエストがあった場合、index ディレクティブに設定されているファイルを左から順に探し、いずれのファイルも見つからなかった場合はエラーが返されますが、index の値の最後に絶対パスでファイルを指定しておくと、そのファイルが内部的に選択され、代わりに返されます。
http {
server {
index index.html index.htm c:/nginx/error.html;
}
}
この例の場合、まず index.html を探し、見つからなかった場合は index.htm を探し、それも見つからなかった場合に c:/nginx/error.html が返されます。
※ クライアントのブラウザ上の URL は変更されません。
indexディレクティブのlocationコンテキストへの影響
location コンテキストを使って URL 毎に処理を分けている場合は注意が必要です。次の例をみてください。
http {
server {
location = / {
index index.html;
}
location /index.html {
# ・・・
}
}
}
リクエストの URL パスが / だった場合、完全一致する最初の location が選択されます。そしてこの location のブロック内でインデックスファイルとして index.html が設定されているため、このファイルが見つかった場合は、内部的に /index.html へのリクエストとして再処理されます。
リクエストの URL パスが /index.html だった場合、 2 番目の location が選択されます。このようにまず最初の location が選択されますが、最終的に 2 番目の location が選択されます。
動作確認
それでは実際に index ディレクティブの動作を確認してみます。 Nginx の設定ファイルである nginx.conf ファイルの http コンテキストに、次のように設定しました(必要な部分のみ抜粋しています)。
http {
server {
root c:/nginx/html;
index index.html hello.html;
location /greeting/ {
index hello.html index.html;
}
}
}
server コンテキストでは index ディレクティブに index.html hello.html を設定しています。また、location コンテキストを使用し、リクエストのパスが /greeting/ の場合には
index ディレクティブを hello.html index.html に変更しています。
ルートディレクトリである c:/nginx/html と、そのサブディレクトリである c:/nginx/html/greeting の両方に
index.html と hello.html ファイルを配置しています。
ブラウザを起動し、次の URL へアクセスします。
http://localhost/
server コンテキストでは index.html hello.html の順で設定されており、ディレクトリ内に index.html が存在するため、index.html が返されます。
今度は次の URL へアクセスします。
http://localhost/greeting/
/greeting/ へのリクエストは location によって処理され、 index ディレクティブは hello.html index.html の順になります。そのため、ディレクトリ内に存在する hello.html が優先されて返されます。
このように index ディレクティブは、指定した順番でファイルの存在を確認し、最初に見つかったファイルが返されます。
-- --
Nginx における index ディレクティブの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。