MTOS管理画面のSSL化:プレビューがうまくできない問題の修正
httpsで管理画面からプレビューしたら、プレビューが真っ白
SSL化したMTOSの画面にて、記事のプレビューをやってみると、プレビューが真っ白になってました。
テンプレートの編集画面からプレビューした際も、同様です。
修正
問題の発生している箇所の特定
htmlソースを見ると、iframeあたりが怪しいようです。
プレビューのページは、静的に生成したプレビュー用ページを、iframeタグで読み込む仕様になっています。
恐らく、httpsのウェブページ内で、iframeをhttpのページを読んでいるのが原因、と思われます。
問題の箇所:
<td id="entry-preview-content" class="preview-content"> <iframe id="frame" frameborder="0" scrolling="auto" src="/knowledge/2014/mt-preview-22a3d2445df792277f264456b912264abdcbe364.html?000932" onclick="return TC.stopEvent(event);"></iframe> </td>
この部分について、htmlソースの生成を司っているのは、MT本体内の次のファイル。
- [MTのルートディレクトリ]/tmpl/cms/preview_strip.tmpl
- [MTのルートディレクトリ]/tmpl/cms/preview_template_strip.tmpl
preview_strip.tmpl は、ウェブページ/記事編集画面からプレビューを行った際に、
preview_template_strip.tmpl は、テンプレート編集画面からプレビューを行った際に、
それぞれ読み込まれます。
記事からプレビューした際の表示の修正
preview_strip.tmpl は、139行目あたりに、問題の部分の生成コードがあるので、そこを修正します。
修正前
<iframe id="frame" frameborder="0" scrolling="auto" src="<$mt:var name="preview_url"$>?<mt:date format="%H%M%S">" onclick="return TC.stopEvent(event);"></iframe>
修正後
<mt:setVarBlock name="var_abs2rel">/https?:\/\/(www\.|)km92.net/g</mt:setVarBlock>
<iframe id="frame" frameborder="0" scrolling="auto" src="<$mt:var name="preview_url" regex_replace="$var_abs2rel","" $>?<mt:date format="%H%M%S">" onclick="return TC.stopEvent(event);"></iframe>
MTの変数 preview_url を mt:var にて出力する際に、
予め変数 var_abs2rel に格納していた置き換えパターンを用いて、
preview_urlの内容をルート相対パス化します。
結果、次のように出力され、プレビューもブラウザに正常に表示されました。
<td id="entry-preview-content" class="preview-content"> <iframe id="frame" frameborder="0" scrolling="auto" src="/knowledge/2014/mt-preview-22a3d2445df792277f264456b912264abdcbe364.html?000932" onclick="return TC.stopEvent(event);"></iframe> </td>
テンプレート編集画面からのプレビューした際の修正
手順は preview_strip.tmpl の時と同様。130行目あたりを次のように修正します。
<mt:setVarBlock name="var_abs2rel">/https?:\/\/(www\.|)km92.net/g</mt:setVarBlock>
<iframe id="frame" frameborder="0" scrolling="auto" src="<$mt:var name="preview_url" regex_replace="$var_abs2rel","" $>?<mt:date format="%H%M%S">" onclick="return TC.stopEvent(event);"></iframe>
結果
無事にプレビューがまた見れるようになりました。