帰ってきた・たぶん難しくないApache2・挑戦!RewriteRule・活用編 ~「メンテナンス中です」ページを出してみよう~ [Linux(Apache)]
いろいろ方法はあるんですが、RewriteRule活用のヒントとして、「メンテナンス中です」ページを出す例を紹介します。
#確か、このblogの趣旨としては「ご家庭の(ry
シチュエーションとしてはこんな感じ。
あるディレクトリ (ここでは 「/var/www/html/maintenance」とします)配下に、「現在メンテナンス中につきご利用いただけません」的なページを一式用意します。画像とかcssとかもね。
そして、そのサーバにあるあらゆるリクエストについて、全て「メンテナンス中です」のページを出すようにします。
まあ、ErrorDocumentを使う方法とかCGIで出しちゃえばいいじゃん的な方法もあるんですが、ここではあえてRewriteRuleを主役に据えて実施してみたいと思います。
① まずは「メンテナンス中です」のページを用意しましょう。
すでに書いた通り、 /var/www/html/maintenance ディレクトリ配下にメンテナンス中ですページを一式用意しましょう。cssファイルが必要なら、cssというサブディレクトリを作成してその下に、画像ファイルが必要なら、imgというサブディレクトリを作成してその下に置くことにしましょう。
「メンテナンス中です」ページの名前は index_maintenance.html とします。(まあ、名前は何でも良いんですがw)
② メンテナンス中ですページは誰でも見られるようにする必要があるのでそのように設定します。
apache2.2系までならこんな感じでバッチコイ設定を入れます。
apache2.4系ならこんな感じです。
で、このディレクトリをドキュメントルートにしましょう。
③ で、RewriteRuleの出番です
基本的な考え方としては、「とにかくindex_maintenance.htmlに読み替える」ことになるでしょう。
サーバ上にはhtmlファイルの他に各種のCGIもあるでしょうし、「http://server/」とか「http://server/somdirectory/」のようにサーバ名やディレクトリ名だけで終わっている可能性もあります。このため、基本的にはありとあらゆるリクエストを読み替えることになるでしょう。ということは、まずは
というRewriteRuleが登場すべきなのはガチという所でしょう。
しかし、index_maintenance.htmlに貼ってある画像とかcssファイルとかまでindex_maintenance.htmlに読み替えるのはまずいので、それらは読み替えず、またindex_maintenance.html自身へのアクセスも読み替える必要は無いと言えます。
そのような訳で、「css/配下とimg/配下へのリクエストは読み替えない」「ファイルが実在する場合は読み替えない」「index_maintenance.htmlへのリクエストは読み替えない」という感じの例外は入れたいと思います。
RewriteCondディレクティブを用意します。
というあたりをRewriteRuleの前に書き足してやれば良いです。(多少、手抜きしてるのでアレですがw)
④ マニアックな需要のための対応
ところで、③のRewriteRuleで対応すると、かなりそのスジな方から苦情(?)が上がる可能性があります。それは、CDNサービスのようなWebページをキャッシュするサービスを利用している場合です。
実は③のRewruteRuleではメンテナンスページが200番応答で出力されてしまうため、そのメンテナンス中のページがキャッシュされてしまうという問題を引き起こします。ということは、メンテナンスが終了してもキャッシュされたページが出力されてしまうため、メンテが終わった後の素敵なページが閲覧出来ないという事態を引き起こす恐れがあります。
このような場合、世間様的には500番系の応答を返してメンテナンス中ですのページを出すのが一般的…らしいです。そんな訳で、③を改良してメンテナンス中ですページを503番応答で出力させてみます。
まず、RewriteRule本体を次のように改めます。
そして、503番エラーが発生したときのためのエラードキュメントを設定します。
こうすることで、応答が503になるので、多くのCDNサービスやらキャッシュサーバ等はメンテナンス中のページをキャッシュしなくなります。…なるはずです。(笑)
#Akamaiさんはキャッシュしなかったよー。
#確か、このblogの趣旨としては「ご家庭の(ry
シチュエーションとしてはこんな感じ。
あるディレクトリ (ここでは 「/var/www/html/maintenance」とします)配下に、「現在メンテナンス中につきご利用いただけません」的なページを一式用意します。画像とかcssとかもね。
そして、そのサーバにあるあらゆるリクエストについて、全て「メンテナンス中です」のページを出すようにします。
まあ、ErrorDocumentを使う方法とかCGIで出しちゃえばいいじゃん的な方法もあるんですが、ここではあえてRewriteRuleを主役に据えて実施してみたいと思います。
① まずは「メンテナンス中です」のページを用意しましょう。
すでに書いた通り、 /var/www/html/maintenance ディレクトリ配下にメンテナンス中ですページを一式用意しましょう。cssファイルが必要なら、cssというサブディレクトリを作成してその下に、画像ファイルが必要なら、imgというサブディレクトリを作成してその下に置くことにしましょう。
「メンテナンス中です」ページの名前は index_maintenance.html とします。(まあ、名前は何でも良いんですがw)
② メンテナンス中ですページは誰でも見られるようにする必要があるのでそのように設定します。
apache2.2系までならこんな感じでバッチコイ設定を入れます。
<Directory "/var/www/html/maintenance"> Order Deny,Allow AllowOverride None Options None <Directory>
apache2.4系ならこんな感じです。
<Directory "/var/www/html/maintenance"> Require all granted AllowOverride None Options None <Directory>
で、このディレクトリをドキュメントルートにしましょう。
DocumentRoot "/var/www/html/maintenance"
③ で、RewriteRuleの出番です
基本的な考え方としては、「とにかくindex_maintenance.htmlに読み替える」ことになるでしょう。
サーバ上にはhtmlファイルの他に各種のCGIもあるでしょうし、「http://server/」とか「http://server/somdirectory/」のようにサーバ名やディレクトリ名だけで終わっている可能性もあります。このため、基本的にはありとあらゆるリクエストを読み替えることになるでしょう。ということは、まずは
RewriteRule .* /index_maintenance.html [L]
というRewriteRuleが登場すべきなのはガチという所でしょう。
しかし、index_maintenance.htmlに貼ってある画像とかcssファイルとかまでindex_maintenance.htmlに読み替えるのはまずいので、それらは読み替えず、またindex_maintenance.html自身へのアクセスも読み替える必要は無いと言えます。
そのような訳で、「css/配下とimg/配下へのリクエストは読み替えない」「ファイルが実在する場合は読み替えない」「index_maintenance.htmlへのリクエストは読み替えない」という感じの例外は入れたいと思います。
RewriteCondディレクティブを用意します。
RewriteCond %{REQUEST_URI} !img/ RewriteCond %{REQUEST_URI} !css/ RewriteCond %{REQUEST_URI} !index_maintenance\.html$ RewriteCond %{REQUEST_FILENAME} !-f
というあたりをRewriteRuleの前に書き足してやれば良いです。(多少、手抜きしてるのでアレですがw)
④ マニアックな需要のための対応
ところで、③のRewriteRuleで対応すると、かなりそのスジな方から苦情(?)が上がる可能性があります。それは、CDNサービスのようなWebページをキャッシュするサービスを利用している場合です。
実は③のRewruteRuleではメンテナンスページが200番応答で出力されてしまうため、そのメンテナンス中のページがキャッシュされてしまうという問題を引き起こします。ということは、メンテナンスが終了してもキャッシュされたページが出力されてしまうため、メンテが終わった後の素敵なページが閲覧出来ないという事態を引き起こす恐れがあります。
このような場合、世間様的には500番系の応答を返してメンテナンス中ですのページを出すのが一般的…らしいです。そんな訳で、③を改良してメンテナンス中ですページを503番応答で出力させてみます。
まず、RewriteRule本体を次のように改めます。
RewriteRule .* - [L,R=503]
そして、503番エラーが発生したときのためのエラードキュメントを設定します。
ErrorDocument 503 /index_maintenance.html
こうすることで、応答が503になるので、多くのCDNサービスやらキャッシュサーバ等はメンテナンス中のページをキャッシュしなくなります。…なるはずです。(笑)
#Akamaiさんはキャッシュしなかったよー。
コメント 0