ファイルの存在を順に確認して処理を分岐する(try_filesディレクティブ)

広告

try_files ディレクティブは、指定したファイルが存在するかどうかを順に確認し、最初に見つかったファイルをクライアントへ返すディレクティブです。複数の候補から適切なファイルを選択したり、ファイルが存在しない場合に別の処理へフォールバックする場合などに使用されます。ここでは Nginx における try_files ディレクティブの使い方について解説します。

try_filesディレクティブの書式

try_files ディレクティブは、指定したファイルが存在するかどうかを順に確認し、最初に見つかったファイルを使用して処理を行うディレクティブです。 try_files ディレクティブの書式は次の通りです。

Syntax:   try_files file ... uri;
          try_files file ... =code;
Default:  —
Context:  server, location

try_files ディレクティブは serverlocation コンテキストで使用できます。引数として、確認するファイルのパスを順に指定します。ファイルとファイルの間は半角スペースを入れてください。

記述したいずれのファイルも見つからなかった場合、 URI が最後に記載されていた場合は、記述した URI へ内部リダイレクトします。

server {
  location /check/ {
    try_files パス1 パス2 内部リダイレクト先のURI;
  }
}

また最後に = の後にステータスコードを記述した場合は、記述したいずれのファイルも見つからなかった場合、クライアントへステータスコードを返します。

server {
  location /check/ {
    try_files パス1 パス2 =ステータスコード;
  }
}

パス名としてリクエスト URI のパスの部分を指定したい場合は、組み込み変数の $uri を使用します。 $uri は正規化されたリクエスト URI のパス部分を参照できます。

server {
  location / {
    try_files $uri $uri/ /index.html;
  }
}

try_filesディレクティブの設定例

try_files ディレクティブの設定例をいくつか見ていきます。

http {
  server {
    location / {
      try_files $uri $uri/ /index.html;
    }
  }
}

Nginx で SPA(Single Page Application)を配信する場合によく利用される設定です。クライアントからリクエストがあったときに、指定されたパスのファイル($uri)やディレクトリ($uri/)が存在しない場合、404 とならないように /index.html を返します。その結果、クライアント側の JavaScript によって適切な画面が表示されます。

http {
  server {
    location /images/ {
      try_files $uri /images/default.png;
    }
  }
}

try_files ディレクティブを使い、リクエストされた画像ファイルが見つからない場合は /images/default.png を返します。

http {
  server {
    location ~ \.php$ {
      try_files $uri =404;
    }
  }
}

try_files ディレクティブを使い、拡張子が .php のファイルへのリクエストがあったときに、ファイルが見つからない場合はステータスコード 404 を返します。

動作確認

それでは実際に try_files ディレクティブの動作を確認してみます。 Nginx の設定ファイルである nginx.conf ファイルで http コンテキストに次のように設定しました。(必要な部分のみの抜粋です)。

http {
    server {
        location /images/ {
            try_files $uri /images/default.png;
        }
    }
}

try_files ディレクティブを使用して、リクエストされた画像ファイルが存在する場合はそのファイルを返し、見つからない場合は /images/default.png を返します。

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

http://localhost/images/circle.png

/images/circle.png ファイルは存在するので、このファイルがクライアントへ返されます。

try_filesディレクティブ(1)

今度は次の URL へアクセスします。

http://localhost/images/box.png

/images/box.png ファイルは存在しないので、 try_files によって /images/default.png が使用され、そのファイルがクライアントへ返されます。

try_filesディレクティブ(2)

このように try_files ディレクティブを使用することで、指定したファイルを順に探し、見つからなかった場合にファイルやステータスコードを返すことができます。

-- --

Nginx における try_files ディレクティブの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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