簡単に特定IPからのアクセス以外ならメンテナンス画面を出してみる

ウノウラボさんのエントリ、メンテナンス画面を簡単に出してみるを参考に、以下を .htaccess だけで実現してみる

  • 特定 IP からのアクセスは認証下で普通にサイト閲覧が可能
  • それ以外の IP からのアクセスなら、メンテナンス画面を表示
  1. まず、こういうことらしいので、何も考えずに 503 エラーを吐く 503.php を用意。
    mod_rewriteでは300番系のエラーを出すことができますが、503のエラーは出せないようなので
  2. 次に、ドメイン下全てを 503 へ Rewrite してやる。
  3. その時に、「自分の IP 以外は」を付ける
  4. そのままでは不安なので、さらに自分の IP のみ、認証下に置く

以上を実現してみたのが、以下。
PHP の部分は丸パクリ。すいませんすいません。

503/503.php

<?php
    header ('HTTP/1.0 503 Service Temporarily Unavailable');
    include(dirname(__FILE__) . '/maintenance.html');
?>

503/maintenance.html

<html>
<body>
<h1>メンテナンス中ですよ</h1>
</body>
</html>

.htaccess
{*.*.*.*} のとこに、自分の IP を、 {path} のとこにパスワードファイルへの絶対 path を入れる

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REMOTE_ADDR} !{*.*.*.*}
    RewriteCond %{REQUEST_FILENAME} !503.php
    RewriteRule ^.*$ /503/503.php [L]
</IfModule>

AuthType Basic
AuthName "Restricted Area"
AuthUserFile /{path}/.htpasswd
require valid-user

Satisfy Any
Order Allow,Deny
Allow from all
Deny from {*.*.*.*}

.htaccess がややこしいけど、こんなことが起きてる(と思う)

  • 自 IP 以外からのアクセスの場合
    1. 503/503.php に飛ばされる
    2. Satisfy Any の 「Allow from all」により認証は必要ないので、そのままメンテナンス画面が表示される
  • 自 IP からのアクセスの場合
    1. 503/503.php には飛ばされない
    2. Satisfy Any の 「Deny from {*.*.*.*}」に該当するので、「require valid-user」を満たす必要がある
    3. パスワードを聞かれる

で、携帯片手に 503 になってることを確認しつつ、PC から設定作業を行うと。


うちは業務では FTP オンリーのレンタルサーバーを使用することがほとんどなので、
システムの入れ替え時にどうしてもサイトを落とす必要が発生してしまう。
設定途中のサイトにアクセスされるとまずいけど、誰もアクセスしないような深夜作業なんていやだしね。
(そもそも、問題の解決方法として間違ってると思うし)
ってことで考えたのがこの方法。