ApacheサーバでRewriteしてメンテナンス画面を表示させる

稼働中のWebアプリで一旦メンテナンス画面を表示させて、その間に新しいバージョンをデプロイしたいことがあります。
Apacheだとmod_rewriteを使い全てのリクエストに対してメンテナンス画面のURLに書き換えるか、メンテナンス画面のURLにリダイレクトさせれば良いです。

URLを書き換える単純な例だとこんな感じに。

RewriteEngine on
RewriteRule .* /maintenance.html

こちらはリダイレクトする例。リダイレクトする場合はRewriteRuleのオプションに[R]を指定します。
同一ドメインにリダイレクトする場合、RewriteCondでリダイレクト先のパスを除外しないとリダイレクトループが発生するので注意です。

RewriteEngine on
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule .* /maintenance.html [R]

システムメンテナンスの時はレスポンスコード503を返すようなので、RewriteRuleのオプションに[R=503]を追加してみます。
メンテナンス画面のURLはRewriteRuleではなく、ErrorDocumentで指定します。
この場合もRewriteCondでErrorDocumentで指定したパスを指定しないと、Apacheのデフォルトのエラーページが返ってしまいます

ErrorDocument 503 /maintenance.html

RewriteEngine on
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule .* /anywhere(何でも良い) [R=503]

最後にドキュメントルートとメンテナンス画面のディレクトリが別の場合の例も。
Aliasディレクティブで/maintenance.htmlというパスをドキュメントルートとは別の/var/www/error/maintenance.htmlというパスに対応させます。

ErrorDocument 503 /maintenance.html

Alias /maintenance.html /var/www/error/maintenance.html
RewriteEngine on
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule .* /anywhere(何でも良い) [R=503]

実際に使う場合、上の設定ファイルを/etc/httpd/conf.d/maintenance.conf.no_maintenanceといった名前で作成します。
そして通常時には設定ファイルをApacheに読み込ませない様にしておいて、メンテナンス時には設定ファイル名を変更しApacheを再起動するスクリプトを叩いて設定ファイルを読みこませればOKです。