ごあいさつ
どーも、aoyamaです。
前回の記事から、半年近く間が空いてしまいました。
毎日暑いですね。夏ですものね。8月ですものね。
私は、弊社内では、マイナーな立場の受託案件を担当しております。
自社のサービスでないと、限られた環境、選択肢の中で問題解決の
提示をしなくてはいけません。
そういう場合に限って、たいして選択肢もない割に、確実性だけは
求められることが多いです。ほんとに。
※2014/08/22 記事の内容を修正しました。
302リダイレクトは不適切であるため、503ステータスを返すのが正しい対応となります。
SEOの知識が足りず、誤った情報を掲載したことをお詫びします。
▼参考
http://web-tan.forum.impressrd.jp/e/2009/06/16/5880
http://seo.septeni.net/seo/1214.html
こんな時どうする?
例えば、本番用のサーバー1台しかない状況だと、事前に本番と
同等の環境を用意するのが難しかったり、似たような環境でも確認しても
「本番確認はどうするのか?」という課題が残ります。
そんな時にメンテナンス表示にしたまま、本番環境での確認をすることが
できる、「メンテナンス表示中に、特定のIPアドレスでサイト確認を行う方法」
を紹介させていただきます。
※この記事の内容を理解せず、ご利用いただいた結果については責任を負いかねますので
理解された上で、適切に応用してください。
対象としている条件(対象としている方)
- HTTPサーバーはApacheである
- .htaccessでmod_rewriteが利用可能である
- .htaccessでErrorDocumentが指定できる
- mod_rewriteの設定はそれなりにしたことがある
- アクセス元は固定IPアドレスである
- css、js、画像などが外部サイトから参照されていない
イメージ図(あくまでも、イメージです。)
まずは、準備
メンテナンス表示画面を用意
ドキュメントルート直下にメンテナンス時に表示するコンテンツ(ロゴ画像、cssなども含む)を
配置するディレクトリ(例:maintenance とします)を作ります。
index.htmlにメンテナンス中である旨を伝える文言と、メンテナンス後にこの画面を見た人のため
にTOPページへの動線を用意しておくとよいでしょう。
また、メンテナンスページは検索エンジンにインデックスされる必要はないので、
メンテナンス表示のindex.htmlにはnoindex robots metaタグを忘れずに入れておきましょう。
この部分は下記にて補足してます。
.htaccessの準備
.htaccessにメンテナンス時の記述を#でコメントアウトして用意しておきます。
他にも、mod_rewiteでリダイレクトの設定を指定している場合は、一番先頭に挿入しておきます。
1 2 3 4 5 6 7 8 9 |
#customized 503 page #ErrorDocument 503 /maintenance/index.html RewriteEngine On RewriteBase / #maintenance #RewriteCond %{REQUEST_URI} !^/maintenance/ #RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ #RewriteRule ^.*$ - [R=503,L] |
簡単な解説
不要だと思いますが、簡単な解説をしておくと
1 |
RewriteCond %{REQUEST_URI} !^/maintenance/ |
アクセスしたURLが「maintenance」ディレクトリ配下でない場合という条件
(これがないとリダイレクトループを起こします。)
1 |
RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ |
アクセスした元のIPアドレスが「203.0.113.1」でも「203.0.113.3」でもない場合という条件
(※IPアドレスはサンプルです。)
1 |
RewriteRule ^.*$ - [R=503,L] |
上記2つの条件を満たした場合に、メンテナンス画面へリダイレクト!503スタータスにする。
メンテナンスは一時的なので、302リダイレクトです。
302リダイレクトの後に普通にHTMLが表示されると検索エンジンに誤った情報を伝えてしまうため、
HTTPステータスでもメンテナンスであることを津合えるために503ステータスを返します。
1 2 |
#customized 503 page ErrorDocument 503 /maintenance/index.html |
503ステータスだけを返すと、サーバー側のデフォルトの503画面が表示されてしまうので、
メンテナンス用のHTMLを指定します。
いざ、メンテナンス表示へ
メンテナンス時の作業の準備ができたら、コメントを外して、メンテナンス表示にします。
ちゃんとメンテナンス表示になっているか確認
1 2 3 4 5 6 7 8 9 |
#customized 503 page ErrorDocument 503 /maintenance/index.html RewriteEngine On RewriteBase / #maintenance RewriteCond %{REQUEST_URI} !^/maintenance/ #RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ RewriteRule ^.*$ - [R=503,L] |
メンテナンス画面へのアクセス以外はメンテナンス画面へリダイレクトされていること
を確認します。
そして、メンテナンス表示中の作業へ
1 2 3 4 5 6 7 8 9 |
#customized 503 page ErrorDocument 503 /maintenance/index.html RewriteEngine On RewriteBase / #maintenance RewriteCond %{REQUEST_URI} !^/maintenance/ RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ RewriteRule ^.*$ - [R=503,L] |
自分のIPアドレスではメンテナンス表示にはならないので、心おきなく、本番確認を
行えます。まぁ、「心おきなく」ってことはないと思いますが。
メンテナンス終了
1 2 3 4 5 6 7 8 9 |
#customized 503 page #ErrorDocument 503 /maintenance/index.html RewriteEngine On RewriteBase / #maintenance #RewriteCond %{REQUEST_URI} !^/maintenance/ #RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ #RewriteRule ^(.*)$ - [R=503,L] |
メンテナンス開始前のように該当箇所をコメントアウトすれば、メンテナンス終了です。
お疲れさまでした。
ポイント
メンテナンス表示時に必要なファイルを特定のディレクトリ下に配置することが
ポイントです。
mod_rewriteは条件を間違えたりするとあっさりリダイレクトループを起こすので
faviconなども必要に応じて置いておきましょう。
※対象の条件にも書きましたが、cssファイルや、jsファイル、画像が他サイトの表示に
利用している場合は、考慮していません。
不都合がある場合は、該当するファイルがリダイレクトされないように、
メンテナンス画面へのリダイレクトの除外条件に追記してください。
css、js、画像はメンテナンス画面へリダイレクトさせない場合の一例
1 2 3 4 5 6 7 8 9 10 11 12 |
#customized 503 page ErrorDocument 503 /maintenance/index.html RewriteEngine On RewriteBase / #maintenance RewriteCond %{REQUEST_URI} !^/css/ RewriteCond %{REQUEST_URI} !^/js/ RewriteCond %{REQUEST_URI} !^/img/ RewriteCond %{REQUEST_URI} !^/maintenance/ RewriteCond %{REMOTE_ADDR} !^(203\.0\.113\.1|203\.0\.113\.3)$ RewriteRule ^.*$ - [R=503,L] |
最後に
たいした内容ではないのになんだかんだで長くなってしまいましたが、ここまでお読みいだだき
ありがとうございます。
アライドアーキテクツでは、エンジニアを募集中です。
一緒に働いてくれる、仲間になってくれる方はこちらからご応募ください。
受託案件を担当しています。 Javascript, Wordpressなどテーマはその時々で変わりますが、役に立つ情報を提供できればと思います。