エラーページの設定(error_pageディレクティブ)

広告

error_page ディレクティブは、ファイルが見つからない場合やアクセスが拒否された場合など、エラーが発生したときにどのページを表示するかを設定するために使用します。ここでは Nginx における error_page ディレクティブの使い方について解説します。

error_pageディレクティブの書式

リクエストされたファイルが見つからない場合などにエラーページが表示されますが、デフォルトで表示されるエラーページの代わりに別のページを表示したい場合に error_page ディレクティブを使用します。 error_page ディレクティブの書式は次の通りです。

Syntax:   error_page code ... [=[response]] uri;
Default:  —
Context:  http, server, location, if in location

error_page ディレクティブは httpserverlocation コンテキスト内で使用できます。引数として、対象となるステータスコードと代わりに表示するページの URI を指定します。

ページの URI はルートディレクトリを起点としたパス(/ から始まる URI)で指定します。

server {
  error_page コード 表示するページのURI;
}

例えばルートディレクトリが html、表示するページの URI が /error/404.html だった場合、実際に表示されるページは html/error/404.html にあるファイルとなります。

複数のエラーコードに対してまとめて設定することもできます。複数のエラーコードを指定する場合は半角スペースで区切って指定します。

server {
  error_page コード1 コード2 コード3 表示するページのURI;
}

外部サイトの URL を指定すると、その URL へリダイレクトすることもできます。

server {
  error_page コード http://example.com/error/sorry.html;
}

指定したページを表示しつつ、クライアントに返すステータスコードを別のコード(例えば 200)にして返すこともできます。

server {
  error_page コード =別のコード 表示するページのURI;
}

クライアントからのリクエストに対して、処理結果を表す 3 桁の数値を返します。この数値を HTTP ステータスコードといいます。成功した場合は 200、失敗した場合は 404500 を返します。ステータスコードの中で、失敗した場合に返すコードのことをエラーコードと呼びます。

サーバー側の処理が失敗した場合、エラーコードと一緒にクライアントから要求されたページのデータではなく、エラー内容を示す簡単なページを返しますが、 error_page ディレクティブを設定することであらかじめ設定した専用のページのデータを返すことができます。

なお Nginx で発生するエラーコードには例えば次のようなものがあります(一部抜粋です)。

403 Forbidden
アクセス権限がないページへのアクセス

404 Not Found
指定されたページが見つからない

500 Internal Server Error
サーバー内部の汎用的なエラー

503 Service Unavailable
サーバーがメンテナンス中などの理由で一時的にリクエストを処理できない

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

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

http {
  server {
    root c:/nginx/html;
    error_page 404 /error/404.html;

    location = /404.html {
      internal;
    }
  }
}

error_page ディレクティブを使い、エラーコード 404 が発生したときに html/error/404.html にあるページを返されます。

なおエラー用のページへクライアントが直接アクセスできないように location 内で internal ディレクティブを設定し、内部リクエストのみアクセスできるようにしています。

error_page による処理は内部リダイレクトとして扱われるため、あらためて location とマッチするかどうかの評価が行われます。

http {
  server {
    root c:/nginx/html;
    error_page 403 404 500 503 /error/40x.html;

    location = /error/40x.html {
      internal;
    }
  }
}

エラーコード 403、 404、 500、 503 のいずれかが発生したときに表示するページを設定しています。

http {
  server {
    root c:/nginx/html;
    error_page 404 =200 /error/404.html;

    location = /error/404.html {
      internal;
    }
  }
}

エラーコード 404 が発生したときに html/error/404.html にあるページを返すように設定すると同時に、クライアントに返すステータスコードを 200 に変更しています。ただし、このような設定は特別な理由がある場合にのみ使用します。

http {
  server {
    root c:/nginx/html;
    error_page 404 /error/404.html;

    location = /error/404.html {
      root c:/other;
      internal;
    }
  }
}

error_page で表示するページの URI は、ルートディレクトリを起点とした URI で指定しますが、例えばルートディレクトリとは異なる場所にあるファイルを指定する場合は、 location コンテキストのブロック内で別のルートディレクティブを設定します。この例の場合、 c:/other/error/404.html ページが返されます。

location コンテキストについては「リクエストされたURLのパスに応じて処理を分岐(locationコンテキスト)」を参照されてください。

動作確認

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

http {
    server {
        root  c:/nginx/html;
        error_page 404 /error/404.html;

        location = /error/404.html {
            internal;
        }
    }
}

error_page ディレクティブを使用して、 404 が発生した場合に html/error/404.html にあるページが返されます。

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

http://localhost/test.html

リクエストで指定したページが見つからないので、 404 が発生し、設定されたエラー用のページが返されました。

error_pageディレクティブ(1)

なお error_page ディレクティブが設定されていない場合は、 404 が発生すると次のようなページが返されます。

error_pageディレクティブ(2)

このように error_page ディレクティブを設定することで、エラーが発生した場合に任意のエラーページを表示できるようになります。

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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