itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

nginxでメンテナンス画面を出す(POSTも対応)

POSTも対応、とか言ってリダイレクトしているだけです
※nginx version: nginx/1.6.2

課題

503でカスタムメンテページを出す設定をしている。
そこにPOSTリクエストがくると405が返ってしまう。
405じゃなくてメンテページを表示したい。

調べたこと

error_page 405 =503 @maintenance;

ググるとこんな記述を見るけど、nginxはstaticなページをPOSTで返せないので対応できないんじゃないかと思った。
なのでGET以外でメンテナンスのルールに流れてきたら、TOPに飛ばしてページを出せば良くね?
という雑な対応。リクエストが無駄に増えてしまうが、もうこれで許してください。
動いているからいいじゃない

結果のコンフィグ(抜粋)

server {

    set $maintenance false;
    if ( -f ~/etc/nginx/maintenance ) {
        set $maintenance true;
    }
    if ($request_uri ~ ^/static/(.*)$) {
        set $maintenance false;
    }
    if ($maintenance = true) {
        return 503;
    }
    error_page 503 @maintenance;
    location @maintenance {
        # POSTで静的ファイル返せないのでリダイレクトする
        if ($request_method != GET) {
            return http://$host;
        }

        root /home/app;
        set $is_sphone false;
        if ($http_user_agent ~ (iPhone|iPod|Android)) {
            set $is_sphone true;
        }
        if ($is_sphone = true) {
            rewrite ^(.*)$ /static/maintenance_sp.html break;
        }
        rewrite ^(.*)$ /static/maintenance.html break;
        expires 0;
    }
}