.htaccessで特定のIPアドレス以外をメンテナンスページへ302リダイレクトさせてみた
ども、どもども。
ウェブサイトの公開時、あるいはメンテナンス時に自分のIPアドレス以外をメンテンスページへリダイレクトさせて、その間にゆっくりと作業を進めたい。
この仕事をやっているとわりとよくある話だと思います。
これを実現するためのhtaccessによるメンテナンス表示(IPアドレスでのアクセス制限)は以下になります。
ErrorDocument 503 /maintenance/index.html #表示させるメンテナンスページ
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance/ #アクセスを許可したいディレクトリ
RewriteCond %{REMOTE_ADDR} !=000.000.00.00 #アクセスを許可したいIPアドレス
RewriteRule ^.*$ - [R=503,L]
</IfModule>
<IfModule mod_headers.c>
Header set Retry-After "Fri, 13 February 2018 09:00:00 GMT" #メンテナンス終了予定時刻を設定
</IfModule>
これで、自分(のIPアドレス)以外がアクセスを試みた際、メンテナンスページが表示されます。
503エラーで表示させるためどのURLへのアクセスであっても同じ内容(メンテナンス)が表示され、そのサービス(サーバー)が一時的に利用できない状態であることを意味するため、例えばGoogleボットなどが訪れても最後に書いてあるRetry-Afterを拾ってメンテナンスが終わる頃に再訪問してくれるという感じになります。( 参照:Wikipedia HTTP 503 )
こちらの方法がいわゆるお作法に基づく正解なのですが、今回の場合はちょっと事情が違いました。
今回構築したのはいわゆるLP(ランディングページ)だったので、HTML+フォームのページ以外には表示するコンテンツが無く、ドキュメントルートにindex.phpだけを設置、テンプレートHTML類も公開ディレクトリ以外に設置していました。
また、今回が初公開となることからすでにindex.htmlを設置し、その中で公開日についてアナウンスしていました。そのため今回のメンテナンス作業(公開作業)はBASIC認証などを用いるのではなく、公開日をアナウンスしているindex.htmlをルートに設置したまま実施しなければならない状況でした。
例えば、index.htmlとindex.phpがルートにある状況なら、通常、https://www.example.com/ にアクセスした際はindex.htmlが優先表示されます(Apacheの設定による)し、また今回はフォームの画面遷移URLがすべて https://www.example.com/#confirm のような感じで遷移するように構築していたため、ルートにindex.htmlを置いてメンテナンスすることはできませんでした。(index.html#confirmなどになってしまう)
それで上記のhtaccessによるメンテナンス表示をしようとしたのですが、今回はここで問題が生じました。
503エラーだとURLが変化しないため、実体がある/maitenance/index.htmlにはアクセスできるのですが、https://www.example.com/ へアクセスした時は、htaccessで実体のないファイルへのアクセスを遮断していたためか500エラーになってしまいました。
でもこのまま作業が進められないのは困ってしまいます。
そこで、これ以外の方法でなんとか自分以外のアクセスをメンテナンスページへ誘導する方法を考えることにしました。
.htaccessで自分以外をメンテナンスページへ302リダイレクトさせた
結論から書くと以下になります。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/maintenance/) #アクセスを許可したいディレクトリ
RewriteCond %{REMOTE_ADDR} !=000.000.00.00 #アクセスを許可したいIPアドレス
RewriteRule .* https://www.example.com/maintenance/index.html [R=302,L] #表示させるメンテナンスページ
</IfModule>
アクセスを許可したいディレクトリとIPアドレスを設定した上で、302リダイレクトのルールを書きました。
302リダイレクトも一時的なURL変更に使われますが、先ほどの503とは異なって、別のURLへリダイレクト(URLが変わる)されます。
これにより、https://www.example.com/へアクセスした際にURLを変更して、https://www.example.com/maintenance/index.html を表示してくれるようになり、500エラーも発生しませんでした。
これで無事に動作確認までをゆっくりと行って、作業完了となったのでした。
一件落着、めでたし、めでたし。
この記事で何がいいたいのか
この方法が正解なのかと言われると...、302リダイレクトによるメンテナンス表示はベストな方法ではありません。
幸い、まだ公開前のコンテンツで、検索エンジンにもインデックスされていなかったので「ほんの10分程度の一時的なメンテナンス」と割り切ってこの方法を採用しましたが、本来であればサーバーの構成などを最初から検討しておいてテスト環境からそのまま移行(公開)する方法も取れたと思いますし、BASIC認証などを設置するように最初から決めておけば、そもそもこんな問題にもならなかったわけです。
ただ、検索エンジンで「htaccess リダイレクト メンテナンス」や「htaccess IPアドレス制限 リダイレクト」などと検索するとほぼ全てが503エラーを利用したリダイレクトの解説だったのですが、落ち着いて考えてみると302リダイレクトでもIPアドレス制限はできるよなってことで、つまりこの記事では「頭を柔らかくしていろんな方法を考えてみよう。ググってコピペだけが正解でもないぜ」ということでした。猛省。
既成概念?先入観?にとらわれず、頭を使ってよく考えて自分の実力につなげていきましょう!という自戒。
お疲れさまでした(苦笑)