2014年03月31日
公開サーバーを別サーバーにする構成の時、出力ファイル内のURLを書き換える
PowerCMS Professional版(Enterprise、Advanced)では、Copy2PublicプラグインによってCMS環境とステージ環境、公開環境を分けた運用が可能です。
この場合(構成によりますが)、上記の図のように、各環境でURLが異なるケースがあります。この時、CMSから出力されるファイル内のURLを置き換える(相対パス変換のためのAbs2Relプラグインを利用する)必要がありますが、その他にもいくつかの方法があります。本記事では、これらの方法についてご紹介します。
AdminScreenReplaceLink プラグイン
AdminScreenReplaceLink プラグインはアルファサードが GitHub で公開しているプラグインで、記事やウェブページの一覧、アイテムの一覧、プレビュー画面といった、公開 URL が読み込まれる種類の管理画面を対象に、置換対象 URL と置換先 URL を自由に決めて URL を置き換えることができます。置換元・置換先 URL はシステムとウェブサイト・ブログ単位のプラグイン設定によって設定し、ブログで未設定なら親ウェブサイト、ウェブサイトで未設定ならシステムのプラグイン設定が、上位から受け継がれます。
出力ファイルに含まれる URL を置き換える
イントラネットなど非公開の URL や、開発・プレビュー用ドメイン名の URL をウェブサイト全般設定の公開パス「ウェブサイト URL」に設定してサイトの構築を進め、それとは異なる別のドメイン名や URL でサイトを公開するためには、それらの公開してはいけない URL を置き換える必要があります。
Abs2Rel プラグインで URL を相対パスに置換する
Abs2Rel プラグインは構築するファイルに含まれる HTML の src
属性値と href
属性値、action
属性値について、ウェブサイト・ブログ自身の URL や絶対パス (「/
」から始まる、ルート相対パスなどと呼ばれる) を、再構築対象ファイルの場所を起点とした相対パスに変換します。プラグインをインストールすると、PowerCMS で管理するすべてのウェブサイトとブログが置換の対象になることに注意してください。システムスコープ (blog_id=0
) のプラグイン設定ではファイル拡張子による除外対象などの設定が可能です。インストールするだけで相対パスに置換されるため手軽な反面、あらゆる記述を網羅しているわけではなく前述の3属性値のみを対象に置換するので、構築するサイトによっては十分な確認が必要です。プラグインによる自動的な置換ではなく、置換部分を詳細に制御したい場合は regex_replace
モディファイアによるテンプレートでの置換が必要です。
regex_replace
モディファイアでテンプレートによりパスを置き換える
まずこの方法は、サイト構築の開始段階から想定して組み込んでおく必要があります。コンテンツの全容を把握した作り手が置換対象を詳細に決定できるので、作り込み次第でほとんど要件に対して意図した通りに置換することができます。
- 処理対象を文字列として捉え、対象のドメイン名や URL を単純にすべて置き換える。
- HTML 属性値のみを対象として置き換え、HTML タグではないテキスト部分は対象外にする。
- 特定の URL を絶対パスやまったく別の URL に置き換えたり、逆に絶対パスを URL に置き換えたりする。
regex_replace
モディファイアによりパスを置換する場合、通常は HTML ファイルを出力しているすべてのインデックステンプレートやアーカイブテンプレートについて、テンプレートの始めから終りまで全体を対象にします。このため理想的には DOCTYPE 宣言 (<!DOCTYPE html>) や head 要素、HTML 閉じタグ (</html>) を含んだテンプレートがあちこちに散在しているのではなく、ブログ毎に1つのテンプレートモジュール、さらに可能ならブログを含めたウェブサイト全体で1つのテンプレートモジュールにまとめるようなテンプレート構造をあらかじめ設計することが重要です。こうすることによりメンテナンス性が高まり、1つのテンプレートモジュールを変更するだけですべての HTML ファイルを漏れなく置き換えることが可能になります。
テンプレートの任意の部分に regex_replace
などのモディファイア処理を適用する場合は常套句として MTFor
タグや MTUnless
タグが有効です。
URL を絶対パスに置き換える
「/
」で始まる絶対パスは、ほとんどの要件に対して万能なパスの記述です。ここでは HTML 属性のうちパスが含まれる代表的な属性値を対象にして、ウェブサイト・ブログの公開 URL (MTBlogURL
) から得たスキーム名やホスト名部分を除去して絶対パスに変換する例を紹介します。
<MTSetVarBlock name="regex_replace">/(<(?i:img(?:\s[^>]*)?\s(?:low)?src|(?:a(?:rea)?|base|link)(?:\s[^>]*)?\shref|(?:embed|frame|i(?:frame|nput)|script)(?:\s[^>]*)?\ssrc|form(?:\s[^>]*)?\saction)\s*=\s*["']?)(?i:<$MTBlogURL regex_replace='/\A((?i:https?:)?\/\/[^\/]+)(?:\/.*|\z)/','$1' regex_replace='/([]\/.\@[])/g','\\$1' regex_replace='/\A((?i:https?):)\\\/\\\/(.+?)(:\d+|)\z/','$1)?\\/\\/(?i:$2)\\.?$3\\/*'$>/g</MTSetVarBlock>
<MTFor regex_replace='$regex_replace','$1/'>
<MTTemplateNote value="例1: 置き換え対象の HTML を囲みます。">
<p><a href="http://example.jp/">http://example.jp/</a>
</MTFor>
<MTTemplateNote value="例2: 出力する HTML をまとめて代入した変数に対して regex_replace モディファイアで置換して出力します。">
<$MTVar name="変数名" regex_replace='$regex_replace','$1/'$>
<MTTemplateNote value="例3: HTML を出力するためのテンプレートモジュールに対して regex_replace モディファイアで置換して出力します。">
<$MTInclude module="モジュール名" regex_replace='$regex_replace','$1/'$>
注意事項
CGI の URL で出力される HTML
コメントやフォームの投稿・プレビューなどで使用される、URL に「mt-*.cgi」を含んだ CGI によって動的に出力される HTML には注意が必要です。ウェブサイトやブログの再構築によって出力される HTML ファイルについては万全を期したつもりでも、公開してはいけないプライベートなホスト・ドメイン名を含む URL がここで漏れてしまう恐れがあります。これら投稿やプレビューの CGI から出力される HTML について、意図通りのパスやホスト名が出力されているかどうか、Web ブラウザのエラーコンソールで HTTP エラーや JavaScript エラーなどが発生していないかどうか、十分に確認してください。
ポップアップ画像
ウェブサイト・ブログのシステムテンプレート「ポップアップ画像」には注意が必要です。各種編集画面などで画像アイテムを選択またはアップロードするとき、ポップアップ表示するオプションを選択すると、編集画面に画像アイテムが挿入されると同時にポップアップ表示用の単独で静的な HTML ファイルが作成されますが、この HTML ファイルは作成されたきり2度と更新されることはなく、単なるファイルとして CMS からは存在が把握しづらい状態で残り続けます。このテンプレートには MTImageURL
タグが使用されており、ウェブサイト・ブログの URL がそのまま出力されます。
コメントを投稿する