【.htaccess】画像やCSSを使った「メンテナンス中」画面を表示する mod_rewrite の書き方
2018/10/04
Webサイトをメンテナンスする際に、サイト内のどのページURLにアクセスしても「現在メインテナンス中です」というページを表示する .htaccess(mod_rewrite) の作成方法です。表示させる画面に画像やcssを扱いたい場合はひと捻りが必要だったので、忘備録としてポストします。
なお、後半はCPIサーバ編です。
メンテナンス中画面表示の .htaccess
メンテナンス中である旨を記したファイル(maintenance.html)を作成。
ロゴ画像、CSSなど、通常通りに作成します。
次に .htaccess ファイル。
「メンテナンス中 .htaccess」でググると簡単に見つかるので、紹介されている内容をコピペしてみます。
簡易版で良いので、以下の様な内容。
1 2 3 4 5 6 7 |
ErrorDocument 503 /maintenance.html <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteRule ^.*$ - [R=503,L] </IfModule> |
軽く内容を解説すると、まず ErrorDocumentディレクティブを /maintenance.html として設定します。
503エラーが起こった際は、/maintenance.html を表示する、という意味合いです。
ちなみに『HTTPレスポンスコード 503』とは、サービスが一時的に過負荷やメンテナンスで使用不可能になっていることを表すレスポンスコードなので、検索エンジンにもメンテナンス中と判断されるので、インデックスされないという特性を持ちます。
次に、Mod Rewriteを使って /maintenance.html 以外のどのページにアクセスされてもURLの書き換えて 503リダイレクトを行い、結果的に /maintenance.html を表示するという処理が走るよう記述します。
出来上がったら上で作成した maintenance.html と一緒にドキュメントルートにアップロードします。
テストアクセスの結果。
ありゃ。
画像のリンクも切れてるし、CSSも効いていませんね。
ということで .htaccess を修正。
1 2 3 4 5 6 7 8 9 |
ErrorDocument 503 /maintenance.html <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteCond %{REQUEST_URI} !=/img/logo.png #←★追加 RewriteCond %{REQUEST_URI} !=/css/maintenance.css #←★追加 RewriteRule ^.*$ - [R=503,L] </IfModule> |
画像(/img/logo.png)とメンテナンス用のCSS(/css/maintenance.css)は例外的にアクセスを許可してみます。
これで、以下のように表示されました。
CSSはメンテナンス中ページのヘッダに埋め込んで書けば問題ありませんが、ロゴ画像は使いたい場面は多々あると思うので、覚えておいて損はしない内容ですね。
CPIサーバ編
と、ここまでがWindows版のapache(ローカル環境)だったのですが、本番サーバであるCPIのシェアードサーバにアップすると、なぜか Internal Server Error。なんでや。
何故そうなるかを色々と書き換えて調査しましたら、
1 |
RewriteRule ^.*$ - [R=503,L] |
でエラーになるようです。
CPIの設定でそうなっているのかどうかまでは分からなかったのですが、エラーになるってことは純然たる事実なので、最終的には以下のように書き換えました。
503リダイレクトのところを、302リダイレクトするよう、書き換えています。
1 2 3 4 5 6 7 8 9 |
<IfModule mod_rewrite.c> Options +FollowSymLinks #←★CPIでは必要 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !=/maintenance.html RewriteCond %{REQUEST_URI} !=/imgs/logo.jpg RewriteCond %{REQUEST_URI} !=/css/maintenance.css RewriteRule ^(.*)$ /maintenance.html [R=302,L] #←★302リダイレクトに変更 </IfModule> |
HTTPレスポンスコード302は、「リクエストされたリソースは、一時的に異なるURIに属する。」という意味。
一時的に、ってところがミソ。
301と302の違いは、301では「そのリソースは『恒久的に』移動しており、その保存先はLocationに示されるURI」というのに対し、302では「そのリソースが『現時点で』保存されているのは、Locationに示されるURI」ということを示しています。
やはり、癖がありますな、CPIサーバー。