Movable Type 3.121-jaにアップグレード

投稿者:

先週半ばくらいから、ちょこちょこと手を加えつつ、Movable Typeを3.01から3.121-jaにアップデート。3.1は既に10月19日にリリースされていて、いちおうアップグレード・パッケージだけはダウンロードしてあったのだが、いざアップグレードしようと思ったら、今月初めに3.121が出ていたので、急遽そちらをDLしてきて、導入。
次回アップグレードに備えて、トラブルシュート&カスタマイズした部分についてまとめておこう。


まず、3.0xから3.1xでは、次の新機能が付け加わっている。
・投稿予約機能: 指定した日時に投稿を公開する機能
・サブカテゴリー: カテゴリーを階層構造にできる機能
・動的(ダイナミック)ページ生成: テンプレートを動的に生成する機能
このブログでは、これらのうち、動的ページ生成機能を、月別アーカイヴに適用。先月半ばくらいに、大量スパムコメントによる再構築要求の増大のせいか、サーバーに過負荷がかかって、MySQLソケットがダウンするということが度々あったので、再構築に時間のかかる月別アーカイヴを動的にしたかったのだ。ほんとはカテゴリー・アーカイヴも、と思ったが、こちらは今のところ、旧いエントリーは日付とタイトルのみの表示にし、最近のエントリーで本文表示させるものの数も10個から5個に半減させたので、再構築の負荷は所要時間も大幅に改善された。
しかし、実は、このアーカイヴの動的化にてこずってしまったので、まずはそのTipsから。
1. アーカイヴの動的化の際の.htaccessの記述について
アーカイヴの動的化については、HINAGATAさんのMT3.11-jaとダイナミック・パブリッシングを参考にしてやってみた。
ここで出くわした最初のトラブルは、自動生成されるはずの.htaccessが自動生成されなかったこと。でも、これはすぐ原因が判明。要は、index.phpやarchivesがあるディレクトリー(diary)に、以前にアーカイヴのパーマリンクの形式を変更した際に、旧いやつから新しいのに自動転送させる.htaccessを置いてあったのだが、その所有者権限がhirakawaになっていたために、MTのcgi動作による上書きができなかったのだ。そこで、元の.htaccessを外して、もう一度手順を繰り返したら、ちゃんと自動生成に成功。
ウチの場合、次のような内容のができる。(コメント部分は削除してあります。)

Options -Indexes
<IfModule mod_rewrite.c>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /~hirakawa/diary/mtview.php
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /~hirakawa/diary/mtview.php [L,QSA]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /~hirakawa/diary/mtview.php
ErrorDocument 403 /~hirakawa/diary/mtview.php
</IfModule>

で、これでめでたしと思いきや、次の難関――今回最大の難関――が。。。自動生成された.htaccessがあるために、なんとindex.phpまでブラウザーでアクセスできなくなり、Forbiddenエラーが出てしまったのだ。
ちなみにサーバーのApacheには、動的化に必要なmod_rewriteもmod_dirもちゃんと入っている。それで、いろいろ.htaccessの行を削ったりしながら試していくと、どうもRewriteEngine onのところで問題が発生するらしいことが判明。しかしなぜそうなのかは全く不明。HINAGATAサポートフォーラムその他、ウェブで探しても同症例は全く見つからない。仕方なく、最後の頼みの綱ということで、いつも心強い、サーバー管理をしている同僚に相談してみると、Apacheのバージョン的にも、.htaccessの記述内容自体は問題がないとのこと。それで、結果的に、次のようにしてみたら、というアドヴィスを得て、試してみたらうまくいった。

Options -Indexes
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /~hirakawa/diary/mtview.php
ErrorDocument 404 /~hirakawa/diary/mtview.php
ErrorDocument 403 /~hirakawa/diary/mtview.php

2. Typekey認証の不具合
これは、どいう不具合かというと、

  1. Typekeyのバージョン・アップに伴うエラー。()
  2. コメント入力の際のTypekey認証で、エラーが出る
  3. Typekey認証(サイン・イン)後、およびサイン・アウト後に、画面が然るべきのものにならない。
    → 認証後に元のページにリダイレクトされたときに「サイン・インしました」の表示が、リロードしないと出ない。サインアウトしたときも、リロードしないとサイン・イン以前の表示に戻らない。

  4. TypeKeyサイトの「コメンターの設定」にある「ニックネーム」が日本語の場合、文字が化けが発生する。

というもの。
1つめの対処はとても簡単。mt.cfgファイルの最終行に

TypeKeyVersion 1.1

と一行加えるだけ。
2つめのエラーは、修正前に試してみたところ、特に出なかったのだが、念のため修正。これも、HINAGATAさんのアップグレード後TypeKeyにサインインできない場合を参照。(HINAGATAさんのとこの説明は3.11版だが、3.12でも同じらしい。)
修正は、個別アーカイヴ(individual archive)テンプレートや、コメント関連のテンプレートにある、「サイン・イン」、「サイン・アウト」をそれぞれはさむ2種類のタグの書き換え。テンプレート中には、それぞれ2箇所ずつあります(カスタマイズされたテンプレートを使ってる人は2つずつではないかもしれない)。ウチはコメント入力は、どのページからも全て個別アーカイヴに誘導してるので、それのみの修正。

サイン・イン
修正前
<a href="<$MTSignOnURL$>&amp;v=1.1&amp;<MTIfNeedEmail>
need_email=1&amp;</MTIfNeedEmail>t=<MTTypeKeyToken>&amp;_return=
<$MTCGIPath$><MTCommentScript>%3f__mode=handle_sign_in%26static=1%
26entry_id=<$MTEntryID$>">サイン・イン</a>
修正後
<a href="<$MTRemoteSignInLink static="1" encode_html="1"$>">サイン・イン</a>
 
サイン・アウト
修正前
<a href="<$MTCGIPath$><$MTCommentScript$>?
__mode=handle_sign_in&amp;static=1&amp;entry_id=&
lt;$MTEntryID$>&amp;logout=1">サイン・アウト</a>
修正後
<a href="<$MTRemoteSignOutLink static="1" encode_html="1"$>">サイン・アウト</a>

3つめのエラーは、実験したら出たので、小粋空間さんのTypeKeyでサイン・インしても表示が変わらない問題を対処を見て修正。個別アーカイブの下記の「修正前」の部分(2ヶ所)を「修正後」の部分に置き換えるだけ。

修正前
<script type=”text/javascript” src=”<MTCGIPath><MTCommentScript>?__mode=cmtr_name_js”></script>
修正後
<script type=”text/javascript”>
<!–
var commenter_name = getCookie(“commenter_name”);
// –>
</script>

4つめのエラーも同じ小粋空間さんのエントリーにあるので、そのまま適用。個別アーカイブやコメント関連テンプレート(コメントプレビュー・コメントリスト・コメントエラー)の上部にあるJavaScriptの赤色部分をそれぞれ青色のスクリプトに置き換え。

修正前
function setCookie (name, value, expires, path, domain, secure) {
    var curCookie = name + “=” + escape(value) + ((expires) ? “; expires=” + expires.toGMTString() : “”) + ((path) ? “; path=” + path : “”) + ((domain) ? “; domain=” + domain : “”) + ((secure) ? “; secure” : “”);
}
function getCookie (name) {
    var prefix = name + ‘=’;
    var c = document.cookie;
    var nullstring = ”;
    var cookieStartIndex = c.indexOf(prefix);
    if (cookieStartIndex == -1)
        return nullstring;
    var cookieEndIndex = c.indexOf(“;”, cookieStartIndex + prefix.length);
    if (cookieEndIndex == -1)
    cookieEndIndex = c.length;
    return unescape(c.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}
 
修正後
function setCookie (name, value, expires, path, domain, secure) {
    var curCookie = name + “=” + (window.encodeURIComponent ? encodeURIComponent(value) : escape(value)) + ((expires) ? “; expires=” + expires.toGMTString() : “”) + ((path) ? “; path=” + path : “”) + ((domain) ? “; domain=” + domain : “”) + ((secure) ? “; secure” : “”);
}
function getCookie (name) {
    var prefix = name + ‘=’;
    var c = document.cookie;
    var nullstring = ”;
    var cookieStartIndex = c.indexOf(prefix);
    if (cookieStartIndex == -1)
        return nullstring;
    var cookieEndIndex = c.indexOf(“;”, cookieStartIndex + prefix.length);
    if (cookieEndIndex == -1)
    cookieEndIndex = c.length;
    var value = c.substring(cookieStartIndex + prefix.length, cookieEndIndex);
    return window.decodeURIComponent ? decodeURIComponent(value) : unescape(value);

}

3. リンク先を新しいウィンドウで開く。
これは、mt.cfgでStaticWebPathで指定したディレクトリーに置いてあるmt.jsのなかの

function insertLink (e, isMail) {
if (!canFormat) return;
var str = getSelection(e);
if (!str) return;
var my_link = isMail ? prompt(‘Enter email address:’) : prompt(‘Enter URL:’, ‘http://’);
if (isMail) my_link = ‘mailto:’ + my_link;
if (my_link != null)
setSelection(e, ‘<a href=”‘ + my_link + ‘”>’ + str + ‘</a>’);
return false;

の青字のところを

setSelection(e, ‘<a href=”‘ + my_link + ‘” target=”_blank”>’ + str + ‘</a>’);

と修正。
とりあえずは、今のところはこんなところ。

 

1つ星 (まだ評価がありません)
読み込み中...

3件のコメント

  1. Movable Type 3.15で、ダイナミック・パブリッシング

    Movable Typeを、3.15にアップデートして、ついでにダイナミック・パ…

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください