2018年02月27日
PowerCMSの会員サイトをメンテナンスモードにする
ウェブサイトの運用をやっていると、外部からのアクセスに対してメンテナンスページを表示させて、 変更中のページやフォームにアクセスできない様にする事があります。
この場合の方法として、 一般的にはウェブサーバーの設定を変更し、サイト内各ページへのアクセスをメンテナンスページにリダイレクトさせていると思われます。
ただ、PowerCMSの会員サイトでは、ウェブサーバーの設定ファイル(Apacheの場合は.htaccess)を機能の一部として用います。
この為、例えばApache上で動いてるPowerCMSの会員サイトに、次のように改修の適用を行う場合、
- 外部の第三者からのアクセスは一律メンテナンスページを出す。
- IP制限で許可したユーザーのみ、会員サイトにアクセスできる。
会員サイトで利用される.htaccessに手を入れる必要がありますが、カスタマイズを誤るとトラブルの元となります。
そこで今回は、この会員サイトで利用される.htaccessについて、 指定IP以外からのアクセスをメンテナンスページにリダイレクトさせるカスタマイズ方法を、 サンプルコードを交えて解説します。
サンプルコードのファイル
members_htaccess_maintenance.zip
アーカイブを解凍すると、次の2ファイルが展開されます。
htaccess__original.txt:
PowerCMS Eiger 1.08.のインデックステンプレート「DynamicMTML .htaccess」のデフォルトのコード。
htaccess__custom.txt
htaccess__original.txtをベースとした、メンテナンスページ表示対応のサンプルコード。
どのようにカスタマイズするか
まず、前提情報として、PowerCMSの会員サイトで利用される.htaccessの仕組みを解説します。
PowerCMSの会員機能の利用は、PowerCMS標準テーマ(名前に「PowerCMS」と付くテーマ)を、対象のウェブサイト・ブログに適用する事が前提です。
これらテーマには、インデックステンプレートとして「DynamicMTML .htaccess」が含まれ、 この内容から会員サイトで利用される.htaccessのコードが生成されます。
サンプルコードの「DynamicMTML .htaccess」の内容は、ぱっと見複雑そうにみえます。
が、実際やっている事は、 外部からのリクエストの内、ディレクティブによる条件にマッチするものを.mtvew.phpにリダイレクトしているだけです。
以上を踏まえると、今回のカスタマイズでは、.mtview.phpへリダイレクトされるリクエストの内、 外部の第三者からのリクエストをメンテナンスページにリダイレクトすれば良い、という事になります。
サンプルコードの解説
前述のサンプルファイル「htaccess__original.txt」「htaccess__custom.txt」の差分について、以降に解説します。
2行目
<MTSetVars> str__allow_ips=^(100\.1\.11\.111|100\.2\.11\.111)$ str__redirect_filenames=(members\.cgi|\.mtview\.php)$ str__maintenance_page_path=<$mt:WebsiteRelativeURL$>
str__maintenance_page_name=maintenance.html </MTSetVars>
メンテナンスモードに係る設定用の変数群です。詳細次の通りとなります。
str__allow_ips:
会員サイトへのアクセスを許可するIPアドレスを記載します。 ここで指定した値は、後述のRewriteCondのパラメータとなります。
str__redirect_filenames:
メンテナンスページにリダイレクトしたいページを、直接ファイル名で指定します。 ここで指定した値は、Filesディレクティブのパラメータになります。 ※なお、次のファイル名の指定は必須となります
- members.cgi
- .mtview.php
str__maintenance_page_path:
メンテナンスページのパスを指定します。
str__maintenance_page_name:
メンテナンスページのファイル名を指定します。
100行目
<Files ~ "<$MTVar name="str__redirect_filenames" $>"> <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REMOTE_ADDR} !<$MTVar name="str__allow_ips" $> RewriteRule ^ <$MTVar name="str__maintenance_page_path" $><$MTVar name="str__maintenance_page_name" $> [L] </IfModule> </Files>
str__redirect_filenamesで指定したファイル名について、メンテナンスページへのリダイレクトを行う為の記載です。 RewriteCondで、str__allow_ipsに指定のIPをメンテナンスページへのリダイレクト対象から除外します。
109行目
<$mt:BlogFilesMatchDirective$> <IfModule mod_rewrite.c> RewriteEngine On #start::maintenance. RewriteCond %{REQUEST_URI} !=<$MTVar name="str__maintenance_page_path" $><$MTVar name="str__maintenance_page_name" $> RewriteCond %{REMOTE_ADDR} !<$MTVar name="str__allow_ips" $> RewriteRule ^ <$MTVar name="str__maintenance_page_path" $><$MTVar name="str__maintenance_page_name" $> [L] RewriteCond %{REMOTE_ADDR} <$MTVar name="str__allow_ips" $> #end::maintenance. RewriteRule ^ <$mt:BlogRelativeURL$><$mt:DynamicSiteBootstrapper$> [L] </IfModule>
<$mt:BlogFilesMatchDirective$>は、 ウェブサイト/ブログの全般設定の項目「ダイナミックパブリッシング設定配下の入力項目「処理対象外の拡張子」 をパラメータとするディレクティブを生成します。 入力項目に指定がない場合は、当該タグが指定するデフォルトの拡張子が、ディレクティブのパラメータに指定されます。
<FilesMatch .*\.(?!php|cgi|fcgi|PHP|CGI|FCGI)$>
ここでもRewriteCondで、str__allow_ipsに指定のIPを、メンテナンスページへのリダイレクト対象から除外します。
141行目
<FilesMatch (^(|[^.]+)|\.[Hh][Tt][Mm][Ll]?)$> <IfModule mod_rewrite.c> RewriteEngine On #start::maintenance. RewriteCond %{REQUEST_URI} !=<$MTVar name="str__maintenance_page_path" $><$MTVar name="str__maintenance_page_name" $> RewriteCond %{REMOTE_ADDR} !<$MTVar name="str__allow_ips" $> RewriteRule ^ <$MTVar name="str__maintenance_page_path" $><$MTVar name="str__maintenance_page_name" $> [L] RewriteCond %{REMOTE_ADDR} <$MTVar name="str__allow_ips" $> #end::maintenance. RewriteRule ^ <$mt:BlogRelativeURL$><$mt:DynamicSiteBootstrapper$> [L] </IfModule>
ここでも109行目と同じように、メンテナンスページのリダイレクトに係る記載を追記しています。
最後に - 案件に応じたカスタマイズ
今回の説明で示したカスタマイズの一例は、会員サイトの.htaccessの仕組みとカスタマイズ方法を理解していただく為のものです。 実際の案件では、要件に応じたもっと良い書き方があるでしょう。
今回示した一例が、会員サイトをカスタマイズする上での参考となれば幸いです。
コメントを投稿する