運営中のWordPressの構造変更やメンテナンスで、メンテナンス中ページを表示する一番簡単な方法が見つかりました。それは、FTPソフトにてindex.htmlファイルを、トップフォルダに置く方法でした。
ただし、それには落とし穴が。。。今回は、プラグインを使わずにメンテナンス中の表示をする方法を紹介します。
WordPressを運用していると、テーマや大幅なサイト構成の変更や修正などで一時的に、メンテナンスページを表示したいことがあると思います。
以前は、メンテナンスページを表示するだけのシンプルなプラグインがあったのですが、いつの間にか複雑な有料ソフトに変わっていて、使いにくく困ってしまいました。
今回は、WordPressを運用しながら、外からきてくれる方にはメンテナンス中と表示して待ってもらうための方法について書いています。
若干玄人っぽさが残っていますが、必要なことは全部わかるようなオールインワン記事になっています。。。
ここに書かれていることの簡単な説明
一番シンプルな、メンテナンスページのファイル名をindex.htmlにする方法と、使えないケースについての説明。
メインになるのが運用期間が長いサイト向けに対して、Webサーバー上の「.htaccess」にて自分のIPアドレス以外のアクセスを、メンテナンスページにリダイレクトする設定を追記する方法と運用方法の紹介。
さらに、GoogleSEO対策も考慮して、メンテナンス終了予定時刻を伝えるRetry-Afterの追記方法を紹介しています。
「.htaccess」への設定に必要になる、自分のIPアドレスのチェック方法に加え、JavaScriptによるRetry-AfterのGMT(グリニッジ標準時)の確認用スクリプト例も紹介しています。
2023年時点でメンテナンス中の表示に最適なプラグインはない
語弊があるので書いておくと、有効インストール数が400万件以上ある、プラグインに限定した話ですが、2023年時点で、メンテナンス中の表示だけに特化した最適なプラグインは見つかりませんでした。
以前使ったことがある有名なプラグインはいつの間にか開発者が代わり、有料サービスのプラグインになっていました。
色々、プラグインを試してみたのですが、やはり時代の流れなのか、ボランティアによる献身的なソフトはなくなり、有料ソフトだったり色々な複雑な機能がついてくるものが多くなりました。
たしかに、1ヶ月や2ヶ月ならまだしも、1年、2年、5年、10年とずっとノーギャラでメンテナンスを続けるなんて、大変です。
たかだか、メンテナンス中の表示をするだけのプラグインでは、誰もお金を払ってくれないため、色々つけたくなる気持ちもわかります。。。。わかるけど。。。困ってしまいます。
WordPressを再セットアップする時の方法
たまたま、再設定で気がついたのですが、どうやら、Webサイトのトップディレクトリーにある、index.htmlという名前がついたファイルに、メンテナンス中の内容を記述して置く方法が一番簡単でした。
index.phpが入っていても、index.htmlが優先的に読み取られるWebサーバーの仕組みを利用したものです。
ただ、落とし穴があり、WordPressの再セットアップなどではうまく行く一方で。。。。
検索結果などの直接リンクやブックマークからのアクセスでは、index.htmlというファイル名で作った、メンテナンスページが表示されません。
もちろん、まだ生まれたてで、h3d.workなどのトップドメインしか世に知られていない場合には有効です。
この方法の解除はとても簡単で、index.htmlのファイル名を-index.htmlなどに変更するか消去するだけです。
テーマ変更や設定変更でのメンテナンス表示方法
index.htmlの設置だけですめば簡単なのですが、WordPressの設定中を見せないためにメンテナンス中の表示をするには、やはり、ちょっと複雑なことをする必要がありました。
色々試したのですが、テーマの設定をするためには、管理者以外のIPアドレスからのアクセスをメンテナンスページに、リダイレクトするように設定するのが一番シンプルだと思います。
メンテナンスページとなるhtmlの作成方法については、長くなりすぎるので割愛します。
.htaccessの設定方法
Webサーバーが表示切り替えをしてもらうために、サーバープログラムのApacheの設定ファイルである「.htaccess」を使うことにしました。
WordPressがインストールされると自動的に「.htaccess」が作成されるので、オリジナルをFTPソフトでダウンロードして、複製したものに、これから紹介するコードを追記していきます。
オリジナルは、メンテナンスモード終了時に、追記版に上書きすることで、元に戻すため保存しておきます。
念には念を入れ、作業ミスでオリジナルの「.htaccess」を上書きする事故を防ぐために、Webサーバー上で複製して_copyを残しておくことをお薦めします。つまりこの時点で、3つの「.htaccess」ができています。
下は、オリジナルの「.htaccess」に追加した記述ルールです。
検索エンジンへのSEO対策も考慮して、メンテナンス中のステータスコードを返す仕組みも入れてみました。
.htaccessは一番上の行から判定されていくため、SSL(https)へのリダイレクト設定の下がお薦めです。ただし、消し忘れやミスのリスクを考えると、一番下の行でも全然問題ありません。
ErrorDocument 503 /maintenance.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REMOTE_ADDR} !=192.168.XX.2
RewriteCond %{REMOTE_ADDR} !=192.168.XX.3
RewriteRule ^.*$ - [R=503,L]
</IfModule>
<IfModule mod_headers.c>
Header set Retry-After "Tue, 07 Nov 2023 13:10:20 GMT"
</IfModule>
一つ目の記述は、ErooDocument 503は、maintenance.htmlを使いなさいという記述です。
二つ目の記述は、IPアドレスが192.168.XX.2と192.168.XX.3以外からのアクセスは、503のステータスコードをつけてmaintenance.htmlページを表示しなさいという記述です。
192.168.XX.2は例として書いた仮のアドレスで、Webサーバーへアクセスする自分のIPアドレスを入れていきます。簡単な調べ方は下に書きました。
三つ目のRetry-Afterは、503を返すmaintenance.htmlのヘッダに、メンテナンス終了時刻を書き込みなさい。という記述です。
いずれも、ほとんどのレンタルサーバーで使われているApache(互換含む)というWebサーバープログラムの設定方法に即した記述です。
メンテナンス状態を確認してからメンテナンスにする
ちょっと、説明が前後していますが、スマートホンなど別のIPアドレスからアクセスできない環境では、メンテナンスページが表示されているかわかりません。
一台のパソコンでの更新作業で「.htaccess」を確実にメンテナンスモードで動かすために重要なことなので、追記します。
先に説明したとおり、「RewriteCond %{REMOTE_ADDR} !=192.168.XX.2」の部分は、自分のアドレスを指定する場所です。
2カ所あるのは2カ所からの同時アクセス対応の例として入っています(必要なのはアクセスするIPアドレスだけです。)。
設定確認が2段階になりますが、まず先頭行に「#(コメントアウト指定)」を追記して、「# RewriteCond %{REMOTE_ADDR} !=192.168.XX.2」にしてから上書きします。
ブラウザのキャッシュ読み込みを防ぐために、新規のプライベートウィンドウなどからアクセスして、メンテナンスページが表示されるかどうかを確認します。
ここで、メンテナンスページが表示されない場合、ブラウザのキャッシュが読み込まれている可能性があります。プライベートウィンドウのページ更新ボタンを押すことで表示されるはずです。
これで駄目なら「.htaccess」の設定にエラーがあります。
無事、メンテナンスページが表示されることを確認してから、「.htaccess」に加えた先頭の「#」を外して上書きすることで、安心してメンテナンスができます。
「.htaccess」の記述ミスで、メンテナンスページが表示されない場合もあるため、シンプルなページを目指していたのですが、一番重要なことなので追記しました。
自分のIPアドレスを調べる方法
一番簡単で確実な方法は、ip-check.phpなど適当な名前をつけたファイルに、下のようなPHPスクリプトを書いて、Webサーバーに設置する方法です。
<?php
echo $_SERVER["REMOTE_ADDR"] ;
$_SERVER[ ]というサーバ情報を読み出す特殊変数配列から、アクセスしたユーザーのIPアドレスを返すだけのスクリプトです。
適当な場所にip-check.phpをアップロードしてアクセスすることで、IPアドレスが表示されるので「.htaccess」にある、192.168.XX.2部分と書き換えて、FTPソフトで置換すれば完了です。
プロバイダーによってはグローバルIPアドレスが自動再設定で毎回変わることがありますが、WordPressの編集作業をしている間に変わることは少ないと思います。
メンテナンス終了日時を伝えるRetry-After
ステータスコード503と一緒に、終了予定時刻を伝えるRetry-Afterを指定することで、ページ収集中のGoogle検索ロボットが伝えられた終了時間まで収集を待ってくれます。
HTTPについて規定しているRFC9110(RFC7231は廃止)によると、Retry-Afterに続く終了予定日時の指定方法(書式)の一つに、IMF-fixdate(旧RFC2617ではRFC1123:rfc1123-date)があります。
HTPS規格:RFC9110 Retry-After(IETF)
HTPS規格:RFC9110 Date/Time Formats(IETF)
書式は、「曜日, 日付 月 年 時:分:秒 GMT」になります。日本時間2023年11月7日22時10分20秒は、グリニッジ標準時で、2023年11月7日13時10分20秒となり、「Tue, 07 Nov 2023 13:10:20 GMT」となります。
JST日本標準時 UTC+0900から、GMT グリニッジ標準時 UTC+0000への変換は、9時間引けばOKです。
GMTを調べるJavaScriptコード
9時間引けばOKですと紹介しておきながら、何回か.htaccessを書き換えている内に計算が面倒になり、IPアドレスを調べるだけのPHPスクリプトに追加してみました。
下のコードは、ページを開くたびに、現在のパソコンの時刻からGMT(グリニッジ標準時)を表示するJavaScriptコードです。
GMT:<input type="text" id= "gmt" value="" size="50">. //コピペのしやすさからテキストボックスを利用
<script>
const d = new Date(); //アクセスしているパソコンの時間を変数に代入
let dgmt = d.toUTCString(); //UTC時刻の文字列へ変換
let gmtE = document.getElementById("gmt");
gmtE.value = dgmt; //input要素に代入
</script>
このスクリプトは、Mozilla Developer Networkにある、toUTCString()のリファレンスドキュメントを元に作成しました。
今回は現在の時刻をGMTで調べるスクリプトですが、例えば日本時間(GMT+0900)からGMTに変更したり、10分間のメンテナンス予定分を加算することもできます。
下はJavaScriptのサンプルコードです。
let dt = new Date("Mon, 22 Jan 2024 22:20:00 GMT+0900"); //GMT+0900にすると日本時間で指定できます
dt.setMinutes(dt.getMinutes()+10); //getに10足してsetしています。これでGMT時刻に10分を加算できます
※Mozilla Developer Network : Date()のリファレンスドキュメント
サーバーメンテナンスの頻度が多い方は、「input」要素を「textarea」要素に変更して、IPアドレスまで織り込み、「.htaccess」に追記するテキストを一気に吐き出すスプリクトに変えるのもアリだと思います。
少し、説明が雑になっていますが、参考になれば幸いです。
メンテナンス中の開始と終了方法
メンテナンスの開始は、今回ルール記述を追記した「.htaccess」をFTPソフトで上書きアップロードします。
メンテナンス作業が終了したら、追記前のオリジナル版の「.htaccess」を上書きすれば、元に戻ります。
自分のIPアドレスからは正常に表示されるため、上書きのミスに気づきにくいところがありますが、再ダウンロードなどで確実に戻ったことが確認できたら、最初にサーバー上で複製したオリジナル版は、削除しても問題ありません。
サーバー上で名前を変えるという方法もありますが、アクセス数が多いサイトの場合は、上書きが一番確実です。
まとめ
こんな説明で、大丈夫なのかなという感じですが、サイト再構築の作業中にメンテナンスモードの設定法を試しながら調べた結果を書いてみました。
どこら辺まで、説明を細かく書いたら良いのかなと迷いつつ、分量少なめで要点だけ書いていましたが、補足などを入れたら、結局少し長くなってしまいました。
2024年1月22日時点での最新情報ですが、RFCがどんどん変わって追うのが大変です。
僕自身のメモ的な記事ですが、誰かの役に立ってくれれば、幸いです。