このサイトではないのですが、レンタルサーバーの不具合で、データベースに接続できなくなりました。
掲示板のプログラムで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日経っても直らない場合は催促してください、なんてメールだけ来ています(*_*))。
コメント