Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
83
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Nginxのエラーページをカスタマイズする方法

Nginxのデフォルトのエラーページは格好良くないし、Nginxを使ってることがバレバレです。それが嫌だったので以下の方法でカスタマイズしました。

基本

Nginxではエラーページのカスタマイズにはerror_pageディレクティブを使います。
カスタマイズの基本的な方法は、custom_404.htmlを作って、nginxの設定ファイルを以下の様な感じにします。
これで、Nginxを再起動して、存在しないファイルへリクエストするとcustom_404.htmlが帰ってくるようになります。

server {

    # 中略

    error_page 404 /custom_404.html;
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }

    # 中略
}

応用

以下では、よりより実践的な例を紹介します。

IP直打ちでのアクセスは全てエラーページを表示

IPアドレスを直接入力してアクセスしてきた場合や想定外のホスト名でアクセスしてきた場合に常にcustom_404.htmlを表示したければ以下の様にします。

server {
    listen 80 default_server;
    error_page 404 /custom_404.html;
    location / {
        return 404;
    }
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}

どんなエラーが発生しても404ページを返す

実際に発生しているエラーが403だろうが503だろうが、ユーザーには404エラーが発生しているように見せかけます。
下の例では403, 404, 500, 503のいずれが発生してもクライアントに返すHTTPステータスコードを404に書き換え、custom_404.htmlを返します。

server {
    listen 80;
    server_name example.com;
    error_page 403 404 500 503 =404 /custom_404.html;
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}

管理画面を隠す

特定のIP以外から管理画面へアクセスされた時は404画面を出します。
この例では192.168.0.1からの管理画面へのリクエストは許可し、それ以外の場合は404ステータスとcustom_404.htmlを返します。

server {
    listen 80;
    server_name example.com;
    error_page 403 404 =404 /custom_404.html
    location /admin {
       allow 192.168.0.1;
       deny all;  
    }
    location = /custom_404.html {
        root /opt/nginx/html;
        internal;
    }
}

Apacheのエラー画面の真似をする

Nginxを使っていることを隠して、代わりにApacheのフリをするには以下のようにします。

server {
    listen 80;
    server_name example.com;
    error_page 403 404 500 503 = /apache_404.html;
    location = /apache_404.html {
        return 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p>The requested URL $request_uri was not found on this server.</p>\n<hr>\n<address>Apache/2.2.31 Server at $host Port $server_port</address>\n</body></html>";
        internal;
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
83
Help us understand the problem. What are the problem?