初代編集長ブログ―安田英久

Webサイトのメンテナンス中画面を出す正しい作法と.htaccessの書き方

サイトのメンテナンス中画面を人間にも検索エンジンにも適切にするやり方。
Web担のなかの人

今回は、Webサイトやサービスをメンテナンス中にする場合に、どのURLにアクセスしても「メインテナンス中です」の画面を出す正しいやり方を、人間にも検索エンジンにも適切にする作法を主眼に解説します。

この週末の土曜深夜~日曜早朝にかけて、データセンターの設備メインテナンスのため、Web担を含むインプレスグループのほとんどのWebサイトが、どのURLにアクセスしても「メンテ中です」という表示になっていました。

なのですが、その実装がちょっと気になったので、「正しいメンテナンス画面の出し方」を説明してみます。

※2010-01-16 Retry-Afterを指定するHeaderの指定を修正しました(コメント参照)
※2009-06-17 RewriteCondから [NC] 条件を削除しました(コメント参照)
※2009-06-16 Retry-Afterの記述をGMTに変更しました(コメント参照)
※2009-06-16 記事タイトルのミススペル.httaccessを.htaccessに修正しました

メンテ中画面を出す正しいApacheの設定

結論としては、正しいやり方は次の2ステップになります。

  1. メンテ中画面を出すWebサーバーに/maintenance.htmlというファイルを作り、人間に対して表示するメッセージをHTMLで書く。
  2. .htaccess(またはhttpd.conf)で、次のどちらかのように設定する。
    最低限バージョン
    ErrorDocument 503 /maintenance.html
    
    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_URI} !=/maintenance.html
      RewriteRule ^.*$ - [R=503,L]
    </IfModule>
    しっかりバージョン
    ErrorDocument 503 /maintenance.html
    
    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_URI} !=/maintenance.html
      RewriteCond %{REMOTE_ADDR} !=192.168.0.4
      RewriteCond %{REMOTE_ADDR} !=192.168.0.5
      RewriteRule ^.*$ - [R=503,L]
    </IfModule>
    
    <IfModule mod_headers.c>
      Header set Retry-After "Sun, 14 Jun 2009 6:00:00 GMT"
    </IfModule>
    • /maintenance.htmlの部分には、メンテ中であることを示すHTMLのパスを指定します。
    • 192.168.0.4192.168.0.5の部分には、管理者のIPアドレスを書きます。管理者IPアドレスがさらにある場合は行をコピーして増やせばOKですし、わからない場合は必要ない場合は行を削除してしまいましょう。
    • Sun, 14 Jun 2009 06:00:00 GMTの部分には、メンテ終了予定時刻を指定します(メンテ終了までの秒数でも出せますが、終了時刻をRFC1123形式で示すほうが楽でしょう、GMTにする必要がありますが)。ただし、ここに指定する値は人間のユーザーには基本的に示されませんし、あくまでも参考データです。

これで、どのURLにアクセスしても、ブラウザに表示されるURLはそのままで、メンテ中を示すページが表示され、しかも、HTTPレスポンスコード503(過負荷/メンテで一時的に利用不可)が返るので、検索エンジンに対しても一時的なメンテだと理解され、メンテ画面がインデックスされることはありません。

また、管理者が使っている一部のIPアドレスからのアクセスに対してはメンテ中を表示せず通常の処理/表示をします。メンテということは必ず状態をチェックするはずですから、自分たちはいつもの状態で確認できる仕組みが必要になるわけですね。

どういった設定だとまずいのか

メンテ中画面を出す悪い例としては、次のようなものがあります。

  • 全URLへのアクセスにRewriteでメンテ中画面を表示

    ブラウザのURL自体はアクセスしようとしたURLのままで、メンテ中画面のHTMLが表示されます。ステータスコードは200。

    実は、検索エンジンへの対応としては最悪のパターン。検索エンジンがメンテ中の内容をその時点のコンテンツとして取得してキャッシュしてしまいます。

  • 全URLへのアクセスを302リダイレクトでメンテ中画面のURLに転送

    ブラウザの表示自体が転送先のページに変わり、しかもそのページはステータスコード200。

    ブラウザの表示URLが変わっているので、ブラウザのリロードでメンテが終わったか確認できませんし、検索エンジンのロボットにも通常のリダイレクトだと判断され、リダイレクト先のコンテンツをインデックスされる可能性があります。

    そもそも、検索エンジンが302リダイレクトを適切に処理できることは期待しないほうがいいでしょう。過去にも302リダイレクトに関するトラブルは頻発していますから。

  • 503でApacheの「Service Temporarily Unavailable」を表示

    あなたのサイトのユーザーが、英語のメッセージ(しかもいつ復旧するのかの情報ナシ)を見て不安に思わないのでしたら問題ないでしょう。ErrorDocument 503に文字列を指定すればこのメッセージを変更できますが、それならHTMLファイルでわかりやすく作るほうがいいですよね。

最初の2つは、レスポンスコード200が返るため、人間に対しては問題ないのですが、検索エンジンのロボットは、それがメンテ中の特別な処理だと認識できず、メンテ中画面をインデックスしてしまう可能性があります。NOT FOUNDなのにステータスコード200を返す「ソフト404」問題と同様ですね(ただし、上記の設定でも、/maintenance.htmlに直接アクセスがあると200が返ります)。

メンテ中もアクセスがあることを前提に、人間にはメンテ中であることをメンテ終了予定時刻とともにHTMLで示し、検索エンジンにはステータスコード503で一時的な状態であることを示す、その両方をちゃんとやるようにしましょう。

ちなみに、この設定はApache 2.2系でしか試していません。また、私はサーバーエンジニアではないので、もっと簡単な良い方法があるのかもしれません。良い方法をご存じの方や、Apache 1.3系や2.0系でどうかなど、コメントで教えていただけると助かります。

この記事は、メールマガジン「Web担ウィークリー」やINTERNET Watchの「週刊 Web担当者フォーラム通信」に掲載されたコラムをWeb担サイト 上に再掲したものです。

この記事が役に立ったらシェア!
メルマガの登録はこちら Web担当者に役立つ情報をサクッとゲット!

人気記事トップ10(過去7日間)

今日の用語

Python
「Python」(パイソン)は、プログラミング言語の1つ。プログラマのグイド・ヴ ...→用語集へ

インフォメーション

RSSフィード


Web担を応援して支えてくださっている企業さま [各サービス/製品の紹介はこちらから]