nginx try_filesディレクティブ

nginx の try_files ディレクティブについての備忘録。

Syntax

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

Module ngx_http_core_module

書かれていることを箇条書きでまとめると...

  • 指定された順序で "file" の存在をチェックし(つまり複数設定できる)、最初に見つかったものを処理する。
  • "file" への path は root と alias ディレクティブに従う
  • 何も見つからない場合は、最後に指定した uri に内部リダイレクトする

例1

設定

server {
    root /usr/share/nginx/html;

    location /images/ {
        try_files $uri /images/default.gif;
    }

    location = /images/default.gif {
        expires 30s;
    }
}

ディレクトリ

$ tree /usr/share/nginx/html/
/usr/share/nginx/html/
|-- 50x.html
|-- images
|   |-- default.gif
|   `-- hello.gif
`-- index.html

という場合に、リクエストとレスポンスの対応は以下のとおり。

リクエスト レスポンス 理由
http://example.com/images/hello.gif /images/hello.gif $uri は /images/hello.gif となり、対象ファイルが存在するため。
http://example.com/images/goodbye.gif /images/default.gif $uri は /images/goodbye.gif となり、対象ファイルが存在しない。このため、default.gif にフォールバックする。

例2

server {
    root /usr/share/nginx/html;

    location / {
        try_files $uri $uri/index.html $uri.html =404;
    }
}

http://example.com/hello をリクエストした場合、nginx は root(/usr/share/nginx/html)を起点に /hello, /hello/index.html, /hello.html を順に探し、見つからない場合には 404 エラーページを返す。

例3

location / {
    try_files /system/maintenance.html
              $uri $uri/index.html $uri.html
              @mongrel;
}

location @mongrel {
    proxy_pass http://mongrel;
}

この例では、ファイルが見つからない場合は、@mongrel という名前付ロケーションにフォールバックする。