Webサイトをメンテナンスモードにする方法(.htaccess・Nginxなど)

サーバー移転やサイトの改修中に、作業途中の崩れた画面を訪問者に見られたくないことがあります。そんなときは、サーバーの設定でメンテナンスページに切り替え、検索エンジンには503を返しておくのが基本です。

メンテナンスモードとは

メンテナンスモードはその名の通り、サイトをメンテナンスしていること示すことです。

デザインの大幅なリニューアルや新しい機能の追加、表示崩れやエラーの修正作業、サーバー移転やデータ移行など一時的にサイトを見せないようにしたい状況があります。
このようなサイトの作業中に一般の訪問者へ「メンテナンス中」のページを表示し、通常のページを見せないようします。作業する人には通常どおりサイトを表示できるようにしておけば、実際の画面を確認しながら作業を進められます。

メンテナンスモードで押さえておきたいポイント

広告

ステータスコード503を返す

メンテナンスページを表示するときは、HTTPステータスコード503(Service Unavailable)を返します。

503ステータスは、サーバーが一時的に利用できない状態を表すコードで、過負荷やメンテナンスで一時的に利用不可の状態を表します。

ただメンテナンス中のページを表示するだけだと、ステータスコードは通常どおりの200(正常)になります。そうすると検索エンジンは「このページの内容はメンテナンス中の案内だ」と判断し、その内容で検索結果に登録してしまうことがあります。503を返しておけば「一時的に見られないだけ」と伝えられるので、インデックスされません。

Retry-Afterで再開の目安を伝える

503とあわせて、再開までの目安の秒数や日時をクローラーに伝えるための情報(Retry-Afterヘッダー)を送っておくと、クローラーが再訪問するタイミングの参考になります。Googleも、サイトを一時的に止める場合はRetry-Afterで目安を指定するよう案内しています。

robots.txtには503を返さない

サイト全体に503を返す設定にすると、robots.txt(クローラーへの指示を書いたファイル)にも503が返るようになります。Googleは、robots.txtには503を返さないよう案内しているので、robots.txtは除外しておきます。

503は長くても2〜3日まで

Googleは503でサイトを止める方法を、長くても2〜3日程度の短い期間にだけ使う手段としています。それ以上続けると検索に大きな影響が出るおそれがあります。長期間の改修はテスト環境で進め、本番サイトの切り替えだけを短時間で行うようにしましょう。

設定方法の選び方

方法使える環境自分だけ通常表示にする方法
.htaccessApache系のサーバー(多くのレンタルサーバー)自分のIPアドレスを除外
Nginxの設定ファイルNginxを直接設定できるVPSなど自分のIPアドレスを除外
そのほかのサーバー設定LiteSpeed、IIS、Caddyなど自分のIPアドレスを除外
PHPPHPで作られたサイト自分のIPアドレスを除外
CDNCloudflareなどを利用している場合CDN側の条件で除外

多くのレンタルサーバーでは.htaccessを使う方法が手軽です。

広告

WordPressの場合は、.htaccessのほかにfunctions.phpやプラグインで切り替える方法もあります。管理画面で作業しながら自分だけ通常表示にしたいときは、こちらのほうが便利です。

メンテナンスページを用意する

.htaccessやNginxで設定する場合は、先に表示するメンテナンスページを作っておきます。ここではサイト直下に「maintenance」フォルダを作り、その中にindex.htmlを置く形にします。画像を使う場合も同じフォルダに入れておくと、あとで除外設定をまとめて行えます。

公開ディレクトリ/
├── .htaccess
├── robots.txt
└── maintenance/
    ├── index.html
    └── logo.png

index.htmlはシンプルなもので十分です。再開予定の日時や問い合わせ先を書いておくと親切です。

HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>メンテナンス中</title>
<style>
  body { margin: 0; font-family: sans-serif; text-align: center; color: #333; }
  .wrap { max-width: 600px; margin: 0 auto; padding: 80px 20px; }
</style>
</head>
<body>
<div class="wrap">
  <img src="/maintenance/logo.png" alt="サイト名" width="200" height="60">
  <h1>ただいまメンテナンス中です</h1>
  <p>9月30日 15:00ごろ再開予定です。<br>ご不便をおかけしますが、しばらくお待ちください。</p>
</div>
</body>
</html>

.htaccessでメンテナンスモードにする(Apache)

多くのレンタルサーバーでは、.htaccess(ディレクトリ単位でサーバーの動作を設定するファイル)を編集してメンテナンスモードにできます。

.htaccessはApacheの仕組みですが、LiteSpeedやOpenLiteSpeedも同じ書き方に対応しているので、以下のコードがそのまま使えます。また、Nginxを使っているレンタルサーバーでも、Apacheと組み合わせた構成などで.htaccessが使えることがあります。まずは.htaccessが使えるかどうか、サーバーのマニュアルなどで確認してみてください。

VPSなどでApache本体の設定を編集できる場合は、同じ内容をバーチャルホストの設定(httpd.confなど)に書くこともできます。.htaccessはサーバー本体の設定を触れない環境のための仕組みなので、書き換えられる環境ならこちらのほうがサーバーの負担も少なくなります。編集後はApacheの再読み込みが必要です。

公開ディレクトリにある.htaccessの先頭に、次のコードを追加します。

# メンテナンスモード ここから
ErrorDocument 503 /maintenance/index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/maintenance/
RewriteCond %{REQUEST_URI} !=/robots.txt
RewriteCond %{REMOTE_ADDR} !=203.0.113.10
RewriteRule ^ - [R=503,L]
</IfModule>
<IfModule mod_headers.c>
Header always set Retry-After "3600" "expr=%{REQUEST_STATUS} == 503"
</IfModule>
# メンテナンスモード ここまで

ErrorDocument 503 /***/***.html → 503の時に表示するページを指定。

RewriteEngine On でリライト機能を有効。

RewriteCond の3行で、maintenanceフォルダ、robots.txt、自分のIPアドレスからのアクセスを対象外にする(アクセスできるようにする)。

RewriteRule ^ - [R=503,L] で、それ以外のアクセスにすべて503を返す。

Header always set Retry-After で、503のときだけRetry-Afterを付ける(3600秒=1時間後)

メンテナンス画面以外にも表示(公開)させておきたいページを指定できます。

RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_URI} !^/hoge.html

画像等のリソースファイなど、特定のファイル形式はメンテナスモードから除外する書き方。

RewriteCond %{REQUEST_FILENAME} !.(css|jpe?g|gif|png|js|ico)$

203.0.113.10 の部分は、自分が使っている回線のIPアドレスに書き換えます。IPアドレスはIP確認サービスなどで調べられます。自宅と職場など複数の場所から確認したい場合は、RewriteCond %{REMOTE_ADDR} !=〇〇〇 の行をIPアドレスの数だけ追加します。

アクセス情報【IPアドレス確認】- CMAN

サブフォルダだけメンテナンスモードにする場合

「/shop/」のように、サイトの一部のフォルダだけをメンテナンスモードにしたい場合は、そのフォルダに.htaccessとmaintenanceフォルダを置きます。

公開ディレクトリ/
└── shop/
    ├── .htaccess
    └── maintenance/
        ├── index.html
        └── logo.png

このとき、ErrorDocument と %{REQUEST_URI} のパスは、.htaccessを置いた場所から数えるのではなく、サイトのルート(ドメイン直下)から書きます。

ErrorDocument 503 /shop/maintenance/index.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/shop/maintenance/
RewriteCond %{REMOTE_ADDR} !=203.0.113.10
RewriteRule ^ - [R=503,L]
</IfModule>
<IfModule mod_headers.c>
Header always set Retry-After "3600" "expr=%{REQUEST_STATUS} == 503"
</IfModule>

/maintenance/index.html のままだとサイト直下のmaintenanceフォルダを探しにいくため、メンテナンスページが見つからず、サーバー標準の「Service Unavailable」画面が表示されてしまいます。また、ErrorDocument のパスを / から始めずに書くと、パスではなく文字列として扱われ、その文字がそのまま画面に表示されます。

robots.txtはサイト直下にあり、サブフォルダの.htaccessの対象にはならないので、この場合は除外の行は不要です。メンテナンスページの中で画像などを読み込む場合は、/shop/maintenance/logo.png のようにそちらのパスも合わせて変更してください。

上記コードを設置したメンテナンスページのテストページ

IPアドレスで除外できないとき

スマートフォンの回線などIPアドレスが頻繁に変わる環境では、除外設定がうまく働かないことがあります。また、CloudflareなどのCDN(コンテンツを別のサーバーから配信する仕組み)を経由している場合、サーバーに届くIPアドレスがCDN側のものになり、自分のIPアドレスでは判定できません。この場合は、CDN側の機能を使うか、WordPressであれば「WordPressをプラグインなしでメンテナンスモードにする方法(functions.php・.maintenance)」で紹介しているfunctions.phpの方法を検討してください。

Retry-Afterを日時で指定する

Retry-Afterは、秒数の代わりに再開予定の日時で指定することもできます。メンテナンスページに書いた「9月30日 15:00ごろ再開予定」に合わせる場合は、次のように書きます。

Header always set Retry-After "Wed, 30 Sep 2026 06:00:00 GMT" "expr=%{REQUEST_STATUS} == 503"

日時で指定するときは、次の点に注意してください。

  • 「曜日, 日 月 年 時:分:秒 GMT」の決まった形式で書く。曜日や月は英語の3文字の略称を使い、曜日も日付と合っている必要がある
  • 時刻は日本時間ではなくGMT(協定世界時)で書く。日本時間から9時間引いた時刻になるので、日本時間の9月30日15:00は「06:00:00 GMT」になる【GMT確認→GMT/グリニッジ標準時とJST/日本標準時の変換と時差の計算 – 時差計算ドットコム】
  • メンテナンスが延びたら日時も書き換える。予定を過ぎた日時のままにしておくと、再開の目安として役に立たなくなる

書き換えの手間を減らしたいなら、秒数での指定が手軽です。秒数なら、アクセスされた時点から数えた目安になるので、作業が延びてもそのまま使えます。

Header の後ろの always は省略しないようにしましょう。always を付けない Header set は主に正常な応答(200など)にヘッダーを付ける設定なので、RewriteRuleで返す503には付かないことがあります。

解除する

作業が終わったら、追加した「メンテナンスモード ここから」〜「ここまで」の行を削除します。次回も使う場合は、各行の先頭に「#」を付けてコメントアウトしておくと、「#」を外すだけで再び有効にできます。

.htaccessが使えない場合

.htaccessは、Apacheと、その書き方に対応したサーバーで使える仕組みです。Nginxだけで動いているサーバーやWindowsのサーバーなど、.htaccessが使えない環境では別の方法で設定します。どの方法でも、503を返すこと、robots.txtとメンテナンスページ自体は対象外にすることは同じです。

Nginxの設定ファイルで設定する

VPSなどでNginxの設定ファイルを直接編集できる場合は、対象サイトの server ブロックに次の内容を追加します。

server {
    # (既存の設定は省略)

    error_page 503 /maintenance/index.html;

    set $maintenance 1;
    if ($remote_addr = 203.0.113.10) { set $maintenance 0; }
    if ($uri = /robots.txt) { set $maintenance 0; }
    if ($uri ~ ^/maintenance/) { set $maintenance 0; }
    if ($maintenance = 1) { return 503; }

    location ^~ /maintenance/ {
        add_header Retry-After 3600 always;
    }
}

.htaccessと同じく、自分のIPアドレス、robots.txt、maintenanceフォルダ以外へのアクセスに503を返しています。

追加したら nginx -t で書式にエラーがないかを確認し、Nginxを再読み込みすると反映されます。解除するときは追加した行を削除(またはコメントアウト)して、もう一度再読み込みします。

IIS(Windowsサーバー)

WindowsのIISでは、サイトの web.config にURL Rewriteモジュールのルールを書き、応答を503にする設定(CustomResponse)を使います。表示するページは、エラーページの設定(httpErrors)で指定します。

Caddy

Caddyでは、設定ファイルのCaddyfileに、条件に当てはまるアクセスに503を返す設定と、エラー時にメンテナンスページを表示する設定(handle_errors)を書きます。

PHPで503を返す

PHPで作られたサイトなら、サーバーの種類に関係なく、プログラム側で503を返すこともできます。すべてのページを表示する入口のファイル(index.phpなど)の先頭に次のコードを追加します。

PHP
<?php
if ( $_SERVER['REMOTE_ADDR'] !== '203.0.113.10' ) {
  http_response_code( 503 );
  header( 'Retry-After: 3600' );
  readfile( __DIR__ . '/maintenance/index.html' );
  exit;
}

ただし、PHPを通らないHTMLファイルや画像などには効きません。ページごとに別のPHPファイルが呼ばれる作りのサイトでは、すべてのファイルに追加する必要があります。WordPressのfunctions.phpを使う方法も、この仕組みを利用したものです。

CDNで切り替える

CloudflareなどのCDNを使っている場合は、CDN側の機能(CloudflareならWorkersなど)で503とメンテナンスページを返すこともできます。サーバーの設定を触らずに済み、サーバー移転のようにサーバー自体を止める作業にも使えるのが利点です。

503が返っているか確認する

設定したら、自分のIPアドレスを除外していない環境からサイトを開き、メンテナンスページが表示されるか確認します。

あわせて、ステータスコードが503になっているかも確認しておきましょう。Chromeのデベロッパーツールを開いて「ネットワーク」タブを表示し、ページを再読み込みすると、一番上に表示されるページ本体の「ステータス」欄で確認できます。

ターミナルが使える場合は、curlコマンドでも確認できます。

curl -I https://example.com/

1行目に「503」、ヘッダーに「retry-after」が表示されていればOKです。robots.txtのURLでも試して、こちらは200が返ることも確認しておきましょう。

キャッシュプラグインやサーバーのキャッシュ機能を使っている場合、キャッシュが残っていると切り替えが反映されないことがあります。切り替え後と解除後にはキャッシュを削除してから確認してください。

広告

カテゴリー : WEB全般