PowerCMS™

【東京セミナー】6月6日(木) 企業Webリニューアル。最初に押えたい要件定義の進め方と、最新CMSで出来ること

PowerCMS ブログ

ホーム > PowerCMS ブログ > URL を置き換える

2014年03月27日

URL を置き換える

CMS で扱う URL に関連した問題とその解決方法はいくつかあります。ここではその助けとなりそうなプラグインや環境変数、テンプレート記述について説明します。

いずれの方法もサイト構築の初期段階から導入しておき、表示確認しておくことが重要です。公開・運用開始後の CMS やサイトに対して途中からパスの変更をする場合は、完全な複製環境を用意して十分慎重に検証することをお勧めします。また HTTPS での CMS 利用を前提とした場合、基本的には1つの CMS で複数ドメインの複数サイトを管理することは難しくなります。

管理画面で読み込まれる URL を HTTPS URL に置換する

通信の盗聴や情報の改ざん、なりすましの危険を回避するために CMS の管理画面を HTTPS 経由で使用する場合、セキュリティを維持するためには管理画面の HTML から副次的に読み込まれる画像ファイルや JavaScript ファイル、CSS ファイルなどをすべて HTTPS 経由で読み込む必要があります。

一方で、CMS を使って構築するサイトの公開 URL は HTTPS ではなく HTTP URL である、というのがまだまだ一般的です。その場合、HTTPS の記事編集画面やアイテムの一覧画面の HTML では、HTTP URL のサイトに使用するための画像アイテムやそのサムネイル画像が HTTP URL のまま Web ブラウザに返されてしまいます。Web ブラウザはセキュリティを保つため、それら HTTP URL の読み込みを制限してエラーを起こし、管理画面に画像を表示しません。このエラーを回避するため Web ブラウザ側の設定を緩めるなどしてしまうと、それは結果としてセキュリティに穴をあけることとなり、本末転倒です。

SSL プラグイン

PowerCMS 4.02 以降には追加オプションプラグイン「SSL プラグイン」が同梱されています。直接 SSL を扱うかのように誤解を招きそうなプラグイン名ですが、実際にはこのプラグインによって、PowerCMS の管理画面を HTTPS 経由で利用する場合に必要となるいくつかの処理が追加されます。どの処理も既定では無効化されているので、環境設定ファイル mt-config.cgi で環境変数を追加して、環境に応じ必要な機能を有効化します。

環境変数「AssetURL2HTTPS」を「1」に設定すると、記事編集画面のリッチテキストエディタ上でプレビュー表示される画像や、アイテムの一覧・編集画面で表示される画像アイテムのサムネイル等について、それらの HTTP URL のスキーム名を「https」に置き換えます。置換するのはスキーム名のみで、URL のホスト・ドメイン名以降については置換しないため、前提として HTTPS の管理画面とウェブサイトでいわゆるドキュメントルートが同じであるか、または HTTPS の管理画面用ドメインでも同じパスで公開ウェブサイトの画像ファイルを配信するように、Web サーバーを設定する必要があります。例えば管理画面 CGI の URL が「https://cms.example.com/app/mt.cgi」でウェブサイト URL が「http://www.example.jp/」、画像アイテムの URL が「http://www.example.jp/img/photo.jpg」の場合は、「https://cms.example.com/img/photo.jpg」 でも同じ画像ファイルを取得できるように Web サーバーを設定します。Apache HTTP サーバーではサーバー環境や構成に応じて mod_proxy モジュールmod_alias モジュールmod_rewrite モジュールが有効です。

環境変数「AssetURL2HTTPSMethods」では、カンマ区切りで URL 置換処理の対象とするアプリケーションのモード (/mt.cgi?__mode=...) を追加することができます。通常、追加設定することはありません。

環境変数「DisabledBlogStats」を「1」に設定すると、PowerCMS 3.2 以前の管理画面でダッシュボードのウィジェット「Blog Stats」を無効化します。PowerCMS 3.2 (Movable Type 5.2) 以前では、ダッシュボードのウィジェット「Blog Stats」で Adobe Flash による時間軸のスライダーグラフが表示されますが、このスライダーグラフは HTTPS の管理画面に対応できないため、このウィジェットごと無効化します。なお、PowerCMS 4 (Movable Type 6) 以降、同ウィジェットは Flash を使用しない新しいウィジェット「サイト情報」(Site Stats) で置き換えられたので、この環境変数を設定する必要はなく、HTTPS のダッシュボードでもサイト情報のウィジェットを利用することができます。

環境変数「InsertURL2HTTPS」を「1」に設定すると、種類が「アイテム」や「画像」のカスタムフィールドで画像アイテムを選択した後に管理画面上で挿入されるプレビュー用 HTML で、img 要素の src 属性値 URL (<img src="http... ">) を、HTTP URL に置き換えます。通常使用することはありません。

環境変数「PreviewInNewWindow

PowerCMS 4 (MT 6) 以降では環境変数「PreviewInNewWindowを「1」に設定することで、編集画面から [プレビュー] ボタンを押してプレビューするときに、プレビュー用の HTML ファイルを従来のプレビュー画面内のインラインフレーム (<iframe>) により読み込んでプレビュー表示するのではなく、プレビュー画面に遷移せず編集画面から新しいウィンドウで開いてプレビュー表示するようになります。

これは HTTPS のプレビュー画面にインラインフレームで HTTP URL のプレビュー用 HTML ファイルを読み込もうとして、Web ブラウザのセキュリティ制限によりプレビューすることができなくなってしまう問題を回避するのに有効です。HTTPS の管理画面から、新しいウィンドウで HTTP URL のサイトのプレビュー用 HTML ファイルを開いて、より公開サイトに近い条件でプレビューできます。

環境変数「LocalPreviews

環境変数「LocalPreviewsを「1」に設定することで、プレビュー用の HTML ファイルに出力されるウェブサイト・ブログの公開 URL は CMS のプレビュー画面と同じスキーム名とドメイン名の URL に置き換えられます。

例えばブログの公開 URL が「http://www.example.jp/blog/」で CMS の URL が「https://cms.example.com/apps/mt.cgi」の場合、プレビュー用 HTML ファイルに出力される画像ファイルなどの URL はすべて「http://www.example.jp/blog/img/file.png」から「https://cms.example.com/blog/img/file.png」に置き換えられます。これを利用して、置き換え後の URL でも同じようにファイルが取得できるよう HTTP サーバーのドキュメントルートなどをうまく調整すれば、HTTPS の管理画面から HTTP URL のコンテンツをプレビューすることができます。

また、編集画面から [プレビュー] ボタンを押してプレビューするときに、プレビュー画面内のインラインフレームに指定されて読み込むプレビュー用の HTML ファイルのパス (<iframe src="...">) も同様に変更されるので、 HTTPS のプレビュー画面にインラインフレームでプレビュー用 HTML ファイルの HTTP URL を読み込もうとしてしまう問題を回避することができます。

ただし、プレビューするサイトのコンテンツは HTTPS で表示されることを考慮していないことが多いので、主に SNS 用の JavaScript によるウィジェットなどが HTTPS のセキュリティ制限によってエラーとなります。この場合はプレビューによる再構築なのかどうかを判断するためにテンプレート変数「preview_template」などを利用して、プレビュー表示では不要だったり都合が悪かったりするウィジェット類を読み込まないようにして回避します。

<MTUnless name="preview_template">
  <script src=" (...HTTPS のセキュリティ制限によってエラーとなってしまう JavaScript ウィジェット)
</MTUnless>

AdminScreenReplaceLink プラグイン

AdminScreenReplaceLink プラグインはアルファサードが GitHub で公開しているプラグインで、記事やウェブページの一覧、アイテムの一覧、プレビュー画面といった、公開 URL が読み込まれる種類の管理画面を対象に、置換対象 URL と置換先 URL を自由に決めて URL を置き換えることができます。置換元・置換先 URL はシステムとウェブサイト・ブログ単位のプラグイン設定によって設定し、ブログで未設定なら親ウェブサイト、ウェブサイトで未設定ならシステムのプラグイン設定が、上位から受け継がれます。

AdminScreenReplaceLink プラグイン設定画面

出力ファイルに含まれる URL を置き換える

イントラネットなど非公開の URL や、開発・プレビュー用ドメイン名の URL をウェブサイト全般設定の公開パス「ウェブサイト URL」に設定してサイトの構築を進め、それとは異なる別のドメイン名や URL でサイトを公開するためには、それらの公開してはいけない URL を置き換える必要があります。

Abs2Rel プラグインで URL を相対パスに置換する

Abs2Rel プラグインは構築するファイルに含まれる HTML の src 属性値と href 属性値、action 属性値について、ウェブサイト・ブログ自身の URL や絶対パス (「/」から始まる、ルート相対パスなどと呼ばれる) を、再構築対象ファイルの場所を起点とした相対パスに変換します。プラグインをインストールすると、PowerCMS で管理するすべてのウェブサイトとブログが置換の対象になることに注意してください。システムスコープ (blog_id=0) のプラグイン設定ではファイル拡張子による除外対象などの設定が可能です。インストールするだけで相対パスに置換されるため手軽な反面、あらゆる記述を網羅しているわけではなく前述の3属性値のみを対象に置換するので、構築するサイトによっては十分な確認が必要です。プラグインによる自動的な置換ではなく、置換部分を詳細に制御したい場合は regex_replace モディファイアによるテンプレートでの置換が必要です。

Abs2Rel プラグイン設定画面

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 がそのまま出力されます。


カテゴリー
サイト制作全般

Recent Entries