Apache1.3系でファイルが存在しない場合のみステータスコード503を返す方法

このサイトではないのですが、レンタルサーバーの不具合で、データベースに接続できなくなりました。

掲示板のプログラムでDBを利用していたのですが、そのサイトの顔と言えるコンテンツだったので、早急な対応が必要でした。

しかしそのサーバーはXREAで、その日は土曜日。休日には対応してくれないだろうし、しかもXREAはサポートがお粗末なので、いつ復旧するか、そもそも復旧できるのかすら分かりません。

Apache1.3系ではR=503はできない

というわけで、とりあえずサーチエンジン対策で503のステータスコードを出すことに決定。

メンテナンス中画面を出す正しい作法と.htaccessの書き方 | Web担当者Forum

を参考にmod_rewriteを使ってやってみます。
(以下、/bbs/以下が掲示板が動作しているディレクトリとします)

.htaccess

ErrorDocument 503 /bbs/503.php

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

でも、これだとInternal Server Error に。
どうやら、Apache1.3系ではR=503はできない模様。
(というかApache1.3だってことをすっかり忘れてました)

Apache1.3系で特定のディレクトリ以下503を返す方法

で、いろいろと調べたところ、以下で取り急ぎ目的を達成できました。

.htaccess

ErrorDocument 503 /bbs/503.php
Redirect 503 /bbs

とりえあえず応急処置はこれで良しとして、次はコンテンツの復旧です。

さんざんCoreserver&XREAで泣かされてきたので、データ復旧しなかった場合を想定して、Googleのキャッシュからコンテンツを拾っていきます(私自身DBのバックアップを忘れていた手落ちもありました)。

そんなわけで、いくつか見つかったキャッシュデータを、静的なHTMLとして拾って、あるべき場所に配置しました。

この段階で、ファイルが存在するとき(要はキャッシュで復旧できたとき)は200でファイルを返して、ファイルが存在しないときは503を返したくなってきます。

そこで、焦っていてどこのサイトだか忘れてしまったのですが、PHPファイルを使って503を出す方法を見つけました。

PHPファイル

<?php
header ('HTTP/1.0 503 Service Temporarily Unavailable');
require_once dirname(__FILE__) . '/maintenance.htm.php';
# maintenance.htmも別途適当に作ります
?>

.htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/bbs/503.php
RewriteRule ^.*$ /bbs/503.php [R,L]

……が、302リダイレクトして503を出すページを表示させるのは気持ち悪いです。

Apache1.3系でファイルが無い場合のみ503を返す方法

というわけで、リダイレクト処理を無くして解決しました。
これでファイルorディレクトリが存在する場合は200とファイルを返し、存在しない場合は直に503を返し、メンテナンス表示をさせることができます。

PHPファイル

<?php
header ('HTTP/1.0 503 Service Temporarily Unavailable');
require_once dirname(__FILE__) . '/maintenance.htm.php';
# maintenance.htmも別途適当に作ります
?>

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/bbs/503.php
RewriteRule ^.*$ /bbs/503.php

というかめっちゃ苦労しました。

XREAは安くて機能が豊富で使いようによってはいいサーバーですが、私の使い方では苦労の方があきらかに多くなったので、もう使うのをやめようと思います(ちなみに月曜の今の時点で、DBは復旧していません……。技術部に回しますが、14日経っても直らない場合は催促してください、なんてメールだけ来ています(*_*))。

コメント

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