メンテナンス中に503を返す

2014年04月21日 公開

ウェブページのメンテナンスにおいて、作業中の中途半端なページや情報を示さない方法として、代替ページを表示することが一般的だ。「メンテナンス中である」と宣言するページが表示されれば、見たヒトは「じゃあまた今度」と思ってくれることだろう。

しかし、ただページを表示させたのでは、ステータスコードは「200 OK」が返ってしまい、クローラたちは「正しく表示された」としてせっせとインデックスしようとしてしまう。インデックス数が多ければ有利ということは無く、むしろどうでもいい「メンテ中です」がインデックスされることにデメリットの方が多いような気がします。

maintenance

というわけで、一時的に見られないページならばステータスコード「503 Service Unavailable(サービス利用できません)」を返し、

  • メンテ中である
  • 見られないのは一時的である

ことをしっかり主張しましょう。

.htaccessを使う

一番手っ取り早いと思います。.htaccessが触れないレンタルサーバーも未だに数多くありますので、事前に確認しましょう。

ErrorDocument 503 temporary.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=temporary.html
  RewriteCond %{REMOTE_ADDR} !=210.*.*.*
  RewriteRule ^.*$ - [R=503,L]
</IfModule>

<IfModule mod_headers.c>
  Header set Retry-After "Mon, 7 Apr 2014 6:00:00 GMT"
</IfModule>

まず、1行目では503の時に表示するページを示します。この場合は、(たいてい).htaccessファイルから見た相対ファイルを記します。

RewriteCond %{REQUEST_URI} !=temporary.html

評価する式が「!=」で判断しているので「一致しなければ」という意味です。つまり「temporary.html」ファイル以外は、ということにまります。

同一ディレクトリで作業を進めるという前提で書いていますので、臨時ファイル「temporary.html」も同一ディレクトリ、「.htaccess」も同一ディレクトリに入れます。フォトPでは。

同様に、次の行も「IPアドレスが210.*.*.*じゃなければ」という意味。ここに制作者のIPを入れておけば、メンテしながら自分だけ実際の表示を確認することができます。(実際には、同じIPの人は大勢いることも少なくないわけですが)。なお、やたら「*」を入れるとワイルドカードで全部となりますので、取り扱いは慎重に。

RewriteRule ^.*$ - [R=503,L]

それ以外はすべて503を返します。

Header set Retry-After "Mon, 7 Apr 2014 6:00:00 GMT"

いつまで見られないのかということを、botに教えておけば、お行儀のいいクローラならばその間は巡回せず、指定日時以降にまた見に来てくれます。

これ系のことは、わからないヒトにはなかなか伝わらないのが悩みです。「はぁ? メンテ中って表示されてんだからいいんじゃね?」と言われると、どこまで行っても話は平行線なので説明を諦めてしまいますが、どのように説明すれば伝わるのでしょうね。

わかりやすい比喩でもあるといいということまではわかってますけど。

.