2017年8月5日土曜日

nginx のエラーレスポンスで json レスポンスを返却してみる

概要

前回 nginx に IP 制限をしてみました
今回は IP 制限した際にデフォルトのエラーページではなく json レスポンスを返却するようにしてみたいと思います

環境

  • Ubuntu 16.04
  • nginx 1.10.3

設定ファイル編集

前回の設定から以下のように編集します

  • vim /etc/nginx/sites-available/ssl
server {
        error_page 403 /403.json;
        location /403.json {
            default_type application/json;
            return 403 '{"error": {"status_code": 403,"status": "Forbidden"}}';
        }
        allow 192.168.100.110;
        deny all;
        listen       443;
        server_name  your.site.domain.com;

        ssl                  on;
        ssl_certificate      /etc/ssl/certs/chain_server.crt;
        ssl_certificate_key  /etc/ssl/certs/server.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            proxy_pass http://localhost:9292/;
            proxy_redirect default;
        }
}

先頭の error_page とエラー用の location を追記しています

error_page 403 /403.json;
location /403.json {
    default_type application/json;
    return 403 '{"error": {"status_code": 403,"status": "Forbidden"}}';
}

403 エラーが発生した場合は /403.json という場所にアクセスします
そして /403.json は Content-Type application/json で {"error": {"status_code": 403,"status": "Forbidden"}} という文字列を返却するように定義しています

こうすることで 403 のエラーページをデフォルトの HTML ではなく json 文字列を返却できるようになります

ポイントは 2 つで 403.html とせずに 403.json として点と default_type ディレクティブを使用して Content-Type を application/json に設定してる点です
これをしないと text/html で返却されてしまいブラウザなどのクライアントなどでは HTML として判断して処理してしまうことになります

最後に

nginx の 403 ページを json 文字列が返るようにカスタマイズしてみました
別途エラーページ専用のファイルを用意しなくてもできるのは嬉しい点かなと思います

うまく application/json で返却されない場合は /etc/nginx/mime.types というファイルに以下の設定が入っているか確認してみてください

application/json                      json;

参考サイト

0 件のコメント:

コメントを投稿