[mod_rewriteメモ]サイトのメンテナンス時にどのURLにアクセスしてもメンテナンスのページを表示するには?

いくつか方法はあるかと思いますが、WebサーバがApacheの場合mod_rewriteはよく使うんじゃないかと思います。自力でいろいろ試して見ると結構ハマるのがこのメンテナンス時にメンテ中の表示を行う方法なんですが、下手な書き方だとループしちゃうんですよね。

ループっていうのはどういう事かというと、例えばhttp://www.example.comというサイト内すべてへアクセスをメンテナンスページにリダイレクトしたい場合下の様に書いてしまいがちですが、これだと、リダイレクトした後のURL自体が同じhttp://www.example.comなので、またRewriteRuleが適用されてリダイレクト、そしてまたRewriteRuleが適用されてリダイレクトと延々と繰り返してしまうことになります。これがループです。

RewriteEngine on
RewriteRule ^(.*)$ http://www.example.com/mainte.html [L,R=503]

※[L]はLastの意味この後に書いたルールは適用しない。ここで終りの意味。
※[R]はコード302にでリダイレクトの意味。[R]=[R=503]。ここでは明示的に302を指定している。

 

ループを回避するにはRewriteCondを使ったちょっとした工夫が必要です。RewriteCondはルールを適用する条件を記述するところです。下ではサーバ変数REQUEST_URIを使ってアクセスされたページがmainte.html以外の場合ルールを適用するようにしています。これで、ループを回避することができます。

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/mainte.html$
RewriteRule ^(.*)$ http://www.example.com/mainte.html [L,R=503]

 

さて、上の方法でサイト内のどのページにアクセスしてもメンテナンス中のページを表示させることができるように作りましたが、上の方法ではメンテナンスを行っている自分自身もメンテナンス中のページが表示されてしまいます。メンテナンスを行っている本人にまでメンテナンス中のページが表示されてしまってはメンテナンスできないので、自分だけは普通にサイトにアクセス出来るようにしたい場合はさらに以下のようにします。

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^8\.8\.8\.8$
RewriteCond %{REQUEST_URI} !^/mainte.html$
RewriteRule ^(.*)$ http://www.example.com/mainte.html [L,R=503]


RewriteCond %{REMOTE_ADDR} !^8\.8\.8\.8$

の行が追加した行です。これは、サーバ変数REMOTE_ADDRを利用してアクセスしてきたリモートホストが8.8.8.8でない場合はという指定になっています。

自分のIPアドレスを指定しておけば、自分だけは普通にアクセス出来るようになります。RewriteCondは並べて書くとデフォルトではAND条件になります。

もしもOR条件にしたい場合は、明示的に下記のように[OR]をつけます。

RewriteCond %{REMOTE_ADDR} !^8\.8\.8\.8$ [OR]

 

もっと、手軽にメンテナンスページを表示する方法としては、メンテナンスページ表示用に用意した別ドメイン上のページに飛ばす方法です。自サイト以外に飛ばしているのでループする心配もないので簡単です。下では自分のIPアドレス以外は、別サイトに用意したメンテナンスページにリダイレクトするように成っています。

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^8\.8\.8\.8$
RewriteRule ^(.*)$ http://maintenance.example.com/ [L,R=302]

動的ページを静的ページに見せかけたりとmod_rewriteはいろいろつかるので詳しくはApacheのリファレンスを見てください。さくらインターネットやXREAなどの共用レンタルサーバでも.htaccessに記述して利用することができます。

◇参考:Apache module mod_rewrite
◇参考:Apache : mod_rewriteリファレンス – dawgsdk.org

Apache詳解リファレンス
楽天 amazon

 


記事修正:2013.08.11

下記記事によると、ステータスコードは302より503の方が好ましいらしいので、修正した。

ステータスコード302 Foundはページが一時的に移動していることを示します。
ステータスコード503 Service Unavailableは、サービスが過負荷やメンテナンスで一時的に利用不可能な状態を示します。

503は過負荷状態のサーバーでよく見かけることがあるので、ステータスコードだけを見ると302の方が好ましい感じがしますが、SEO的な意味合いからは503ほ方がいいようです。

HTTPステータスコード – Wikipedia

参考:

タグ :