メンテナンスモード

最終更新日時:2008-06-30 15:39:54
Apache

メンテナンス


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

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


のような感じでmod_rewriteを使えば簡単に実現できます。
もしくは、単にredirectでもOKでしょう。
しかし、この方法では、いわゆる検索エンジンのロボットがメンテナンス中にクロールしに来た場合には、工事中表示が正規のコンテンツだと思ってインデックスに追加してしまいます。

Google仕様


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

503を返すには


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に工事中ドキュメントを置き、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を再起動。
実際に動作確認をしましょう。

※Apache2系の場合は、ソースコードに手を入れなくても設定可能かも。未確認

お問い合わせは 掲示板 にて。