先週半ばくらいから、ちょこちょこと手を加えつつ、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認証の不具合
これは、どいう不具合かというと、
- Typekeyのバージョン・アップに伴うエラー。()
- コメント入力の際のTypekey認証で、エラーが出る
- Typekey認証(サイン・イン)後、およびサイン・アウト後に、画面が然るべきのものにならない。
→ 認証後に元のページにリダイレクトされたときに「サイン・インしました」の表示が、リロードしないと出ない。サインアウトしたときも、リロードしないとサイン・イン以前の表示に戻らない。 - TypeKeyサイトの「コメンターの設定」にある「ニックネーム」が日本語の場合、文字が化けが発生する。
というもの。
1つめの対処はとても簡単。mt.cfgファイルの最終行に
TypeKeyVersion 1.1
と一行加えるだけ。
2つめのエラーは、修正前に試してみたところ、特に出なかったのだが、念のため修正。これも、HINAGATAさんのアップグレード後TypeKeyにサインインできない場合を参照。(HINAGATAさんのとこの説明は3.11版だが、3.12でも同じらしい。)
修正は、個別アーカイヴ(individual archive)テンプレートや、コメント関連のテンプレートにある、「サイン・イン」、「サイン・アウト」をそれぞれはさむ2種類のタグの書き換え。テンプレート中には、それぞれ2箇所ずつあります(カスタマイズされたテンプレートを使ってる人は2つずつではないかもしれない)。ウチはコメント入力は、どのページからも全て個別アーカイヴに誘導してるので、それのみの修正。
サイン・イン
修正前
<a href="<$MTSignOnURL$>&v=1.1&<MTIfNeedEmail>
need_email=1&</MTIfNeedEmail>t=<MTTypeKeyToken>&_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&static=1&entry_id=&
lt;$MTEntryID$>&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>’);
と修正。
とりあえずは、今のところはこんなところ。
Movable Type 3.15で、ダイナミック・パブリッシング
Movable Typeを、3.15にアップデートして、ついでにダイナミック・パ…
MT/MEMO
M3AFrontPage http://bloom.moo.jp/blog/archives/2005/01/post_11.html http://www.cs.kyoto-wu.ac.jp/~hirakawa/diary/archives/200412/072210.php
サーバ移転しました
サーバ移転しました。 といってもレンタルサーバは同じwillnetのままです。 …