Apache によるメンテナンス表示

スポンサーリンク

はじめに

コンテンツ入れ替え等のメンテナンス作業の際に、いわゆる「ただいまメンテナンス中です」のような表示をドメイン全体に渡って表示したいことがあります。
何も考えずに、単純にドメイン内の全アクセスをある特定のファイルに集中させるだけであれば、下記のような感じで簡単に実現できます。

 RewriteEngine On
 RewriteRule ^/.*$ /test.html [L]

もしくは、単にredirectでもOKでしょう。
しかし、この方法では、メンテナンス中に検索エンジンがクロールしに来た場合には、メンテナンス中表示が正規のコンテンツだと思ってインデックスが更新されてしまいます。

Googleの検索エンジンクローラ(googlebot)は、 503 が返ってきた際には、これを正規のコンテンツだとせずに後でまたコンテンツを改めて取得してインデックス化する、、という仕様を公開しています。
従って、googlebot仕様に対応するのであればメンテナンス中は、ドメイン内の全アクセスに対して503 を返せばよいことになります。
さらに、エラードキュメントとして 503 専用のものを用意すれば、メンテナンス中表示のカスタマイズにも対応することができます。

設定方法

Apache2 系での設定です。
メンテナンス表示用の HTML を /maintenance.html とする設定例です。

 RewriteEngine On
 RewriteCond %{REQUEST_URI} !=/maintenance.html
 RewriteRule ^.*$ - [R=503,L]
 ErrorDocument 503 /maintenance.html

かなり古い情報

以降、Apache1 系の時の情報です。
今となってはおそらく使う場面はほとんど無いと思いますが、念のため残しておきます。

Apacheでは 3xx,4xx を返すことは redirect で可能ですが、5xx を返すことができない仕様となっています。
従って、通常は redirect や mod_rewrite で特定のCGIやPHPの類を参照させるように設定し、そのCGI や PHP で503を返すようにして実現可能です。
しかし、この場合、CGI や PHP がもともと使えればいいですが、使えない場合にはそれだけのためにCGI や PHP の環境を用意しなくてはいけないので、環境によっては適切な方法とはいえません。
そこで、ここでは mod_rewrite のソースコードに手を入れて mod_rewrite で実現する方法を紹介します。

以下のような設定で /xxx/ 以外のアクセスに対しては 503 を返すことを考えます。
また、/xxx/503.html にメンテナンス用 HTML ファイルを置き、503を返した際にはこれを参照するようにします。

RewriteEngine On
 RewriteRule !^/xxx/ /xxx/503.html [R=503,L]
 ErrorDocument 503 /xxx/503.html

以下、apache_1.3.41, DSO対応でのビルドの例です。
ビルドする前に上記を設定しておきます。
修正ファイルは、src/modules/standard/mod_rewrite.c だけです。
修正内容は、mod_rewrite の redirect 機能を使う際に、3xx,4xx だけでなく、503も許可するという修正になります。

 --- src/modules/standard/mod_rewrite.c.orig     2008-05-02 14:17:44.000000000 +0900
 +++ src/modules/standard/mod_rewrite.c  2008-05-02 14:47:00.000000000 +0900
 @@ -854,7 +854,8 @@
             else if (ap_isdigit(*val)) {
                 status = atoi(val);
             }
 -            if (!ap_is_HTTP_REDIRECT(status)) {
 +            /*            if (!ap_is_HTTP_REDIRECT(status)) {*/
 +            if (0) {
                 return "RewriteRule: invalid HTTP response code "
                        "for flag 'R'";
             }
 @@ -1149,7 +1150,7 @@
             }
 
             /* determine HTTP redirect response code */
 -            if (ap_is_HTTP_REDIRECT(r->status)) {
 +            if (ap_is_HTTP_REDIRECT(r->status) || r->status == 503) {
                 n = r->status;
                 r->status = HTTP_OK; /* make Apache kernel happy */
             }
 @@ -1450,7 +1451,7 @@
             }
 
             /* determine HTTP redirect response code */
 -            if (ap_is_HTTP_REDIRECT(r->status)) {
 +            if (ap_is_HTTP_REDIRECT(r->status) || r->status == 503) {
                 n = r->status;
                 r->status = HTTP_OK; /* make Apache kernel happy */

修正したら普通に make します。
すると、src/modules/standardにmod_rewrite.so ができるので、これを libexec にコピーします。
※念のため元々の mod_rewrite.so のバックアップは取っておきましょう
コピーしたら apache を再起動して実際に動作確認をしましょう。

コメント

タイトルとURLをコピーしました