2010年8月30日

Movable Typeの復元時に「Malformed UTF-8 character~」エラーとなる対処について

先日、Movable Type のバックアップと復元を利用して、当サイトのサーバの移転を行ったのですが、復元時にエラーが発生する事象がありましたので、情報展開しておきます。

1.問題

復元時に次のようなエラーが発生し、復元が正常に完了しません。

復元時のエラー

ログには次のようなメッセージが表示されていました。

エラーメッセージ

メッセージは次の通り、「Malformed UTF-8 character~」と出力されています。

Malformed UTF-8 character (fatal) at /usr/local/lib/perl5/site_perl/5.10.1/mach/XML/LibXML/Error.pm line 217.
 at lib/MT/BackupRestore.pm line 431

このようなエラーが発生すると、エラーが発生する直前までのデータしか復元されません。

2.原因

エラーが発生する原因は、トラックバックに含まれるテキストの文字化けでした。FC2ブログからのトラックバックに含まれるサイト名やトラックバックの本文がすべて文字化けしていました。

3.対処

文字化けしているデータを修正します。すべて修正したあと、バックアップを再取得します。

修正方法ですが、まず文字化けしているデータを探します。データを探すには、バックアップ時に生成されるXMLファイルを、ブラウザ(Firefox)にドラッグします。

XMLが正常にパースできないときは、ブラウザに次のようなエラーが表示されます。

パースエラー

ドラッグするXMLファイルのファイル名は、概ね次のようなフォーマットになっています。バックアップファイルを圧縮して出力している場合は、展開した中にXMLファイルがあります。

Movable_Type-yyyy-mm-dd-hh-mm-ss-Backup-1.xml

そして、エラーが表示されたトラックバックを探します。上記の例ではIDが「6891」なので、そのIDのトラックバックを探します。IDでは検索できないので、トラックバック一覧の「編集」というリンクをポイントして、そのURLに含まれるトラックバックIDから探します。

該当のトラックバックがみつかったら、削除するか、あるいは文字化けしているデータを修正します。

トラックバック編集画面

データを修正するには、トラックバック編集画面に表示されているトラックバック元のURLをブラウザで表示し、そのページのタイトルや本文をコピーして手入力で修正します。

Comments [0] | Trackbacks [0]
2010年8月24日

Movable Type 5で「テンプレート「Create Entry」の再構築中にエラーが発生しました」というエラーが発生する件について

MTQの「コミュニティ掲示板 初期作成でテンプレートエラーになる」で、タイトルの再構築エラーの件が話題になったので、情報展開します。

1.問題点

コミュニティブログまたはコミュニティ掲示板の再構築で次のようなエラーが発生する。

テンプレート「Create Entry」の再構築中にエラーが発生しました: <mtInclude>タグでエラーがありました: 「Header」というモジュールテンプレートが見つかりませんでした。

再構築エラー

2.原因

MTのインストール時に選択した使用言語と、新たに作成するコミュニティブログまたはコミュニティ掲示板の「使用言語」の選択が異なっているため。

インストール時の使用言語の選択
グローバルテンプレート一覧画面

「使用言語」の選択(一番下の項目)
ブログ作成画面

この事象は、上の画像のように、インストール時の使用言語が「日本語」で、ブログ作成時の言語が「English」、あるいはインストール時の使用言語が「English」で、ブログ作成時の言語が日本語の場合などに発生します。

3.対処1

コミュニティブログまたはコミュニティ掲示板作成時、誤った言語選択を行っていた場合は、作成したブログを削除し、「使用言語」をインストール時の言語に合わせてブログを再作成してください。次項の「対処2」を行う必要はありません。

4.対処2

MTインストール時の選択言語(日本語)と、新たに作成したコミュニティブログまたはコミュニティ掲示板の言語を異なるものにする必要がある場合、次に示す、ブログの各テンプレートの修正を行えば、再構築エラーを解消することができます。

ここでは、インストール時の言語が「日本語」で、新たに作成するコミュニティブログまたはコミュニティ掲示板の使用言語に「English」を選択した場合の対処方法を説明します。

「Create Entry」インデックステンプレート

対処前

…前略…
<$mt:Include module="Header"$>
…中略…
<$mt:Include module="Footer"$>
…後略…

対処後

…前略…
<$mt:Include module="ヘッダー"$>
…中略…
<$mt:Include module="フッター"$>
…後略…

「Archive Index」インデックステンプレート

対処前

…前略…
<$mt:Include module="Header" body_class="mt-archive-index"$>
…中略…
<$mt:Include module="Footer"$>

対処後

…前略…
<$mt:Include module="ヘッダー" body_class="mt-archive-index"$>
…中略…
<$mt:Include module="フッター"$>

「Main Index」インデックステンプレート

対処前

…前略…
<$mt:Include module="Header" body_class="mt-main-index"$>
…中略…
<$mt:Include module="Footer"$>

対処後

…前略…
<$mt:Include module="ヘッダー" body_class="mt-main-index"$>
…中略…
<$mt:Include module="フッター"$>

「Sidebar」テンプレートモジュール

テンプレート名を「サイドバー」に変更

「Entry Form」テンプレートモジュール

対処前

…前略…
<form method="post" action="<$mt:CGIPath$><$mt:CommunityScript$>" name="entry_form" id="create-entry-form" enctype="multipart/form-data">
    <input type="hidden" name="__mode" value="post" />
    <input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
    <input type="hidden" id="magic_token" name="magic_token" value="" />
    <mt:SetVarBlock name="field-content"><input id="entry-title" class="ti" name="title" /></mt:SetVarBlock>
    <$mt:Include module="Form Field" id="entry-title" class="" label="Title"$>
 
    <mt:SetVarBlock name="field-content"><textarea id="entry-body" class="ta" name="text" rows="15" cols="50"></textarea></mt:SetVarBlock>
    <$mt:Include module="Form Field" id="entry-body" class="" label="Body"$>
 
    <mt:If tag="BlogCategoryCount">
        <mt:SetVarBlock name="field-content">
            <select id="entry-category" name="category">
                <option value="0">Select Category...</option>
            <mt:TopLevelCategories>
                <mt:SetVarBlock name="loop_to"><$mt:Var name="__depth__" _default="0"$></mt:SetVarBlock><mt:SetVarBlock name="spacer"><mt:For start="1" end="$loop_to">    </mt:For></mt:SetVarBlock><option value="<$mt:CategoryID$>"><$mt:Var name="spacer"$><$mt:CategoryLabel$></option>
                <$mt:SubCatsRecurse$>
            </mt:TopLevelCategories>
            </select>
        </mt:SetVarBlock>
        <$mt:Include module="Form Field" id="entry-category" class="" label="Category"$>
    </mt:If>
 
    <mt:EntryCustomFields>
        <mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName escape="html"$></mt:SetVarBlock>
        <mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
        <mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1" escape="html"$></mt:SetVarBlock>
        <mt:SetVarBlock name="required"><mt:CustomFieldIsRequired>1<mt:else>0</mt:CustomFieldIsRequired></mt:SetVarBlock>
        <$mt:Include module="Form Field" id="$custom_field_id" class="" label="$custom_field_name" required="$required"$>
    </mt:EntryCustomFields>
    <input type="submit" accesskey="s" name="post" id="entry-submit" value="Submit" />
</form>
…後略…

対処後(4ヶ所修正)

…前略…
<form method="post" action="<$mt:CGIPath$><$mt:CommunityScript$>" name="entry_form" id="create-entry-form" enctype="multipart/form-data">
    <input type="hidden" name="__mode" value="post" />
    <input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
    <input type="hidden" id="magic_token" name="magic_token" value="" />
    <mt:SetVarBlock name="field-content"><input id="entry-title" class="ti" name="title" /></mt:SetVarBlock>
    <$mt:Include module="フォームフィールド" id="entry-title" class="" label="Title"$>
 
    <mt:SetVarBlock name="field-content"><textarea id="entry-body" class="ta" name="text" rows="15" cols="50"></textarea></mt:SetVarBlock>
    <$mt:Include module="フォームフィールド" id="entry-body" class="" label="Body"$>
 
    <mt:If tag="BlogCategoryCount">
        <mt:SetVarBlock name="field-content">
            <select id="entry-category" name="category">
                <option value="0">Select Category...</option>
            <mt:TopLevelCategories>
                <mt:SetVarBlock name="loop_to"><$mt:Var name="__depth__" _default="0"$></mt:SetVarBlock><mt:SetVarBlock name="spacer"><mt:For start="1" end="$loop_to">    </mt:For></mt:SetVarBlock><option value="<$mt:CategoryID$>"><$mt:Var name="spacer"$><$mt:CategoryLabel$></option>
                <$mt:SubCatsRecurse$>
            </mt:TopLevelCategories>
            </select>
        </mt:SetVarBlock>
        <$mt:Include module="フォームフィールド" id="entry-category" class="" label="Category"$>
    </mt:If>
 
    <mt:EntryCustomFields>
        <mt:SetVarBlock name="custom_field_name"><$mt:CustomFieldName escape="html"$></mt:SetVarBlock>
        <mt:SetVarBlock name="field-content"><$mt:CustomFieldHTML$></mt:SetVarBlock>
        <mt:SetVarBlock name="custom_field_id">profile_<$mt:CustomFieldName dirify="1" escape="html"$></mt:SetVarBlock>
        <mt:SetVarBlock name="required"><mt:CustomFieldIsRequired>1<mt:else>0</mt:CustomFieldIsRequired></mt:SetVarBlock>
        <$mt:Include module="フォームフィールド" id="$custom_field_id" class="" label="$custom_field_name" required="$required"$>
    </mt:EntryCustomFields>
    <input type="submit" accesskey="s" name="post" id="entry-submit" value="Submit" />
</form>
…後略…

5.修正内容の解説

コミュニティブログまたはコミュニティ掲示板で使われているテンプレートから、グローバルテンプレートを呼び出しています。グローバルテンプレートのテンプレート名はインストール時の言語に依存します。日本語でインストールすれば日本語で表示されます。

以下はグローバルテンプレートの一覧画面です。

グローバルテンプレート一覧画面

グローバルテンプレートを呼び出すには、MTIncludeタグを利用します。「ヘッダー」テンプレートモジュールを呼び出すには次のようにします。

<$mt:Include module="ヘッダー"$>

ところが、コミュニティブログまたはコミュニティ掲示板のテンプレートに含まれる、MTIncludeタグのmoduleモディファイアの値は、ブログ作成時に選択した言語に依存します。

「English」を選択した場合、ヘッダーテンプレート呼び出しのMTIncludeタグは、次のようになります。

<$mt:Include module="Header"$>

これはコミュニティブログまたはコミュニティ掲示板に限ったことではありませんが、この2つのテーマはグローバルテンプレートを呼び出すところが、クラシックブログなどの、他のテーマと異なっています。クラシックブログであれば、テンプレートモジュールの呼び出しが自テーマ内に閉じているので、言語選択は影響しません。

そして、このようなアンマッチな状態で再構築を行うと、「Header」というテンプレートモジュールは存在しないため、冒頭のような再構築エラーが発生します。

エラーを解消するには、MTIncludeタグで呼び出すテンプレートモジュールの名称と、呼び出されるテンプレートモジュール名を対応させます。

なお、ブログ作成画面の言語選択のプルダウンメニューに次のような説明がありますが、このエントリーで示す修正が必要であることを指しています。

グローバルテンプレート一覧画面

グローバルなDefaultLanguage設定と異なる言語を選んだ場合、グローバルテンプレートの名称が異なるため、テンプレート内で読み込むモジュール名の変更が必要な場合があります。
Comments [0] | Trackbacks [0]
2010年8月 8日

さくらインターネットで Movable Type のダイナミックパブリッシングによる500エラーを確実に解消する方法

さくらインターネットで Movable Type のダイナミックパブリッシングによる500エラーを解消する方法をまとめましたので、本エントリーにて情報展開致します。

さくらインターネット+ダイナミックパブリッシング+500エラーの解消方法は、色々なサイトで公開されているのですが、サイトパスの設定によって500エラーが解消されないケースがあったため、改めて調査を行い、どのような設定を行なっても確実に500エラー解消する方法を網羅しました。

また、他のサイトでは500エラーを解消するための対処方法として冗長な情報も紛れ込んでいると思われるため、本エントリーでは正常に動作させるための最小限の方法のみ紹介し、それ以外の変更の要否については、5項にFAQとしてまとめてみました。認識誤りがありましたらご指摘ください。

動作を確認したプランは、さくらインターネット「レンタルサーバ」の「スタンダード」プランおよび「マネージドサーバ」です。Movable Typeのバージョンは5.02で確認しましたが、MT4.xでも同様の対処で解消すると思われます。

1.問題点

さくらインターネットのスタンダードプランやプレミアムプランを利用している場合、ダイナミックパブリッシングを設定し、設定後にダイナミックパブリッシング対象のページにアクセスすると、次のような500エラーが発生します。

500エラー

2.原因と対処(その1:.htaccessの修正)

1つの原因は、多くのサイトで言及されていますが、ダイナミックパブリッシングを設定した際に生成される .htaccess というファイルの中にある4行目のOptionsディレクティブ(赤色部分)がさくらインターネットでサポートされていないためです。

## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
Options -Indexes +SymLinksIfOwnerMatch
  <IfModule mod_rewrite.c>
  …後略…

エラーログを確認すると、次のような1行が表示されているので、このことより上記の原因であることが分かります。

/home/xxx/www/mt/.htaccess: Options not allowed here

対処方法は、FFFTPなどのFTPツールで、このファイルをローカルPCにダウンロードして、任意のエディタで開き、この1行を削除する(対処1-1)か、あるいはOptionsディレクティブの行頭に半角の「#」をつけてコメントアウトします(対処1-2)。編集後、同じディレクトリにアップロードしてください。

対処1-1

## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
  <IfModule mod_rewrite.c>
  …後略…

対処1-2

## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
#Options -Indexes +SymLinksIfOwnerMatch
  <IfModule mod_rewrite.c>
  …後略…

編集後、同じディレクトリにアップロードしてください。この対処方法は公式ドキュメントでも公開されています。

Movable Type FAQ - ダイナミックパブリッシングを有効にすると500エラーが発生する

余談ですが、エラーログを参照する設定は、サーバコントロールパネルより、「アクセスログの設定」をクリックします。

サーバコントロールパネル1

そして、「アクセスログの保存設定」から「残す」を選択して、「エラーログも残す」をチェックします。

サーバコントロールパネル2

3.原因と対処(その2:ディレクトリのパーミッション修正)

2項の対処だけを行なっても500エラーが解消しない場合、もうひとつの原因は、ウェブサイトやブログのサイトパスとなるディレクトリのパーミッションです。

MTの管理画面でウェブサイトやブログのサイトパスを作成すると、そのディレクトリのパーミッションは「777」になります。さくらインターネットではsuexecを採用しており、「777」というパーミッションではother(1桁目)にwriteパーミッションがあるため、500エラーとなります。

エラーログを確認すると、次のような1行が表示されており、上記が原因であることが推測されます。

suexec policy violation: see suexec log for more details

suexecのログは確認していませんが、ネットで検索すると次の記事がありました。

予定は未定であって決定ではない - suexec policy violation: see suexec log for more details

対処方法は、ダイナミックパブリッシングを適用しているウェブサイトまたはブログの一番最後のサイトパスのパーミッションを「705」に変更します。

念のため、FFFTPを利用したパーミッションの変更方法を以下に掲載しておきます。

変更対象となるサイトパスの一番下位のディレクトリを右クリックして、「属性変更」を選択します。例えばサイトパスが /home/[ユーザ名]/www/foo となっている場合、fooディレクトリを選択します。

属性の変更1

開いたダイアログで、ディレクトリのパーミッションを「705」に変更します。「755」でも問題ありません。

属性の変更2

パーミッションを変更するディレクトリはこの部分のみです。それより上位のディレクトリのパーミッションを変更する必要はありません。また、/home/[ユーザ名]/www 直下をウェブサイトやブログのサイトパスにする場合、wwwのパーミッションが755になっていればこの作業は不要です。

また、ネット上でのsuexecの情報で「701」の設定が推奨されている場合もありますが、その設定ではスタイルシートファイルなどが参照できなくなったため、少なくともotherにリード権のある705に変更してください。

4.ダイナミックパブリッシングを利用するパスが複数ある場合

ウェブサイトとブログ、あるいは複数のブログでそれぞれダイナミックパブリッシングを行なっている場合は、2項と3項の対処についてそれぞれ実施してください。具体的には次の通りです。

  • ウェブサイトのサイトパスにある.htaccessを修正し、ウェブサイトのサイトパスのパーミッションを変更
  • 各ブログのサイトパスにある.htaccessを修正し、ブログのサイトパスのパーミッションを変更

またブログで、アーカイブをブログパスと別のパスで公開している場合も、アーカイブパスのディレクトリについて、2項と3項の対処を行なってください。

5.FAQ

ネット上でみつけた他の対処方法についての要/不要について、この項で見解を述べておきます。理解が間違っていたらご指摘ください。

Q:mtview.phpのパーミッションを変更する必要はありますか?
A:パーミッションを変更する必要はありません。705/755に変更してください。

ダイナミックパブリッシングを設定すると、サイトパス上にmtview.phpというファイルが生成されます。このファイルのパーミッションは644で生成され、「CGIと動作させるために755や705に変更してください」という情報がありましたが、す。特に変更する必要はありません。もしCGIとして動作させるために変更が必要なのであれば、MTのインストールディレクトリに含まれるPHPファイルのパーミッションをすべて変更しなければならなくなります。てください。

なお、mtview.phpおよびPHPファイルのパーミッションが644でも正常に動作することを確認しています。

いずれの場合も、mtview.phpが属するディレクトリのパーミッションも705/755に変更してください。777など、「グループ」「その他」のクラスに書き込み権があるパーミッションでは500エラーが発生します。

Q:templates_cやcacheというディレクトリのパーミッションの変更は必要ですか?
A:パーミッションを変更する必要はありません。

ダイナミックパブリッシングを設定すると、サイトパス上にtemplates_cというディレクトリが生成されます。また、キャッシュの利用を有効にすると、さらにcacheというディレクトリが生成されますが、これらのパーミッションは変更せずに表示されることを確認しています。

Q:ファイルの拡張子を.htmlから.phpに変更する必要はありますか?
A:拡張子を変更する必要はありません。

ダイナミックパブリッシングは.htaccessで制御し、通常の.htmlファイルをPHPとして動作させるため、拡張子を変更する必要はありません。

注:これらの見解について、Movable Type の環境変数はすべてデフォルトの状態で動作確認を行なっています。UploadPermsやUploadUmaskなど、環境変数の設定状況によってはこの限りでないかもしれません。

6.モジュール版での設定

これまでに説明した設定は、CGI版(PHPをCGIをして動作させる場合)での話です。

さくらインターネットでは、レンタルサーバの上位サービスの「ビジネスプロ」やマネージドサーバであれば、PHPの「モジュールモード(モジュール版)」が用意されています。このモードを利用する場合、2項の設定のみ行い、3項の設定は行なわなくても正常に動作するようです。

CGI版とモジュール版の違いについては以下の記事を参照してください。

PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例

7.「キャッシュ」または「条件付き取得」の併用

ダイナミックパブリッシングを利用する場合、サーバの負荷を軽減するために、「キャッシュ」または「条件付き取得」の併用を推奨します。

設定方法は、ダイナミックパブリッシングを設定したあと、「設定」→「全般」をクリックし、次の画面で「キャッシュする」または「条件付き取得を有効にする」をチェックします。

キャッシュまたは条件つき取得

キャッシュをすることで、前回のアクセスから変更されていないページはキャッシュを利用します。条件付き取得は、HTTP 304応答を行ないます。詳細は下記のページを参照してください。

Movable Typeドキュメント - ダイナミックパブリッシング

8.その他

スタティックパブリッシングからダイナミックパブリッシングに移行した場合、スタティックパブリッシングの設定時にすでに出力されていたページは、「.static」という拡張子をつけてリネームされます。

実験では、このファイルが残っていれば、3項の対処を行なわなくてもアクセスが可能な場合がありましたが(理由は不明)、ダイナミックパブリッシング設定後のブログ記事などは500エラーとなるので、必ず3項の対処を実施してください。

なお、「.static」という拡張子がついたファイルは再利用されることはありませんので、ディスクの容量削減のため、削除することを推奨します。

2010.09.01
FAQの記述を修正しました。

Comments [6] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3