PowerCMS™

PowerCMS ブログ

ホーム > PowerCMS ブログ > PowerCMSの会員サイトをメンテナンスモードにする

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の仕組みとカスタマイズ方法を理解していただく為のものです。 実際の案件では、要件に応じたもっと良い書き方があるでしょう。

今回示した一例が、会員サイトをカスタマイズする上での参考となれば幸いです。


カテゴリー
DynamicMTML
PowerCMS 4
サイト制作全般
技術情報