初代編集長ブログ―安田英久Webサイトのメンテナンス中画面を出す正しい作法と.htaccessの書き方サイトのメンテナンス中画面を人間にも検索エンジンにも適切にするやり方。noteで書く今回は、Webサイトやサービスをメンテナンス中にする場合に、どのURLにアクセスしても「メインテナンス中です」の画面を出す正しいやり方を、人間にも検索エンジンにも適切にする作法を主眼に解説します。この週末の土曜深夜~日曜早朝にかけて、データセンターの設備メインテナンスのため、Web担を含むインプレスグループのほとんどのWebサイトが、どのURLにアクセスしても「メンテ中です」という表示になっていました。その実装がちょっと気になったので、「正しいメンテナンス画面の出し方」を説明してみます。結論としては、正しいやり方は次の2ステップになります。メンテ中画面を出すWebサーバーに/maintenance.htmlというファイルを作り、人間に対して表示するメッセージをHTMLで書く。.htaccess(またはhttpd.conf)で、次のどちらかのように設定する。GMT"</IfModule>/maintenance.htmlの部分には、メンテ中であることを示すHTMLのパスを指定します。192.168.0.4や192.168.0.5の部分には、管理者のIPアドレスを書きます。管理者IPアドレスがさらにある場合は行をコピーして増やせばOKですし、わからない場合は必要ない場合は行を削除してしまいましょう。GMTの部分には、メンテ終了予定時刻を指定します(メンテ終了までの秒数でも出せますが、終了時刻をRFC1123形式で示すほうが楽でしょう、GMTにする必要がありますが)。ここに指定する値は人間のユーザーには基本的に示されませんし、あくまでも参考データです。これで、どのURLにアクセスしても、ブラウザに表示されるURLはそのままで、メンテ中を示すページが表示され、しかも、HTTPレスポンスコード503(過負荷/メンテで一時的に利用不可)が返るので、検索エンジンに対しても一時的なメンテだと理解され、メンテ画面がインデックスされることはありません。管理者が使っている一部のIPアドレスからのアクセスに対してはメンテ中を表示せず通常の処理/表示をします。メンテということは必ず状態をチェックするはずですから、自分たちはいつもの状態で確認できる仕組みが必要になるわけですね。いった設定だとまずいのかメンテ中画面を出す悪い例としては、次のようなものがあります。全URLへのアクセスにRewriteでメンテ中画面を表示ブラウザのURL自体はアクセスしようとしたURLのままで、メンテ中画面のHTMLが表示されます。ステータスコードは200。実は、検索エンジンへの対応としては最悪のパターン。検索エンジンがメンテ中の内容をその時点のコンテンツとして取得してキャッシュしてしまいます。全URLへのアクセスを302リダイレクトでメンテ中画面のURLに転送ブラウザの表示自体が転送先のページに変わり、しかもそのページはステータスコード200。ブラウザの表示URLが変わっているので、ブラウザのリロードでメンテが終わったか確認できませんし、検索エンジンのロボットにも通常のリダイレクトだと判断され、リダイレクト先のコンテンツをインデックスされる可能性があります。そもそも、検索エンジンが302リダイレクトを適切に処理できることは期待しないほうがいいでしょう。過去にも302リダイレクトに関するトラブルは頻発していますから。Unavailable」を表示あなたのサイトのユーザーが、英語のメッセージ(しかもいつ復旧するのかの情報ナシ)を見て不安に思わないのでしたら問題ないでしょう。503に文字列を指定すればこのメッセージを変更できますが、それならHTMLファイルでわかりやすく作るほうがいいですよね。最初の2つは、レスポンスコード200が返るため、人間に対しては問題ないのですが、検索エンジンのロボットは、それがメンテ中の特別な処理だと認識できず、メンテ中画面をインデックスしてしまう可能性があります。FOUNDなのにステータスコード200を返す「ソフト404」問題と同様ですね(ただし、上記の設定でも、/maintenance.htmlに直接アクセスがあると200が返ります)。メンテ中もアクセスがあることを前提に、人間にはメンテ中であることをメンテ終了予定時刻とともにHTMLで示し、検索エンジンにはステータスコード503で一時的な状態であることを示す、その両方をちゃんとやるようにしましょう。2.2系でしか試していません。私はサーバーエンジニアではないので、もっと簡単な良い方法があるのかもしれません。1.3系や2.0系でどうかなど、コメントで教えていただけると助かります。上に再掲したものです。「Web担当者Forum」編集長。個人としては、技術とマーケティングの融合によるインターネットのビジネス活用の新しい姿と、ブログ/CGM時代におけるメディアのあるべき姿を模索し続けている。趣味は素人プログラミングと上方落語と南インドカレー。AdWordsが消滅、18年の歴史を終え「Google広告」へ。最近(過去90日間)の記事で、Facebookの「いいね!」が多かった記事をお見逃し無く。ネット広告への強い嫌悪感、テレビや新聞の倍以上に。いいね!私は変人コレクター。17:33タイトルが「.httaccess」になっていたので、「.htaccess」に変更しました。YAKさんのご指摘に感謝です。ケータイは......常識で考えると仕様で定められているものは理解してくれ......ます......かね......うーん。23:58誤植を見つけました。最後にダブルクウォートが洩れているようです。05:59まつぼっくりさん、ご指摘ありがとうございます。403だけなんですね。閉じダブルクオーテーションを入れると、それも文字列として表示されるというおかしなルールなので、印象に残っていました。確認すると、そもそもHeaderディレクティブの場合は閉じるのが正しいルールでしたし、いまはどんな文字列でも閉じダブルクオーテーションが必要なことになっていました。調査不足で失礼いたしました。実は、いまでも行末までを文字列として扱う場合は、閉じなくても動作するんですね。最初の記述で大丈夫なのだと思いこんでいました。17:33勉強不足にてすみません。最低限バージョンにて記載されている「-」の意味は何でしょうか。以下のように解釈しているのですが、「-」がどういった意味のコマンド(?)なのかがわかりません。それ自体に意味をもっていないように感じるのですが、どういった場合に「-」は使えるのでしょうか。23:40こんにちは。RewriteRuleのリライト後URLとして「-」を指定すると、「URLを変更しない」指示になります。レスポンスコードに503を返してRewrite処理を終了という意味になります。呼ばれる特殊な置き換え文字列があります。置換を行なわないという機能を提供してくれるものです。