パーマリンクがディレクトリ・インデックスとなるようにしたまではよかったけれども、そこにはもひとつ、落とし穴があった。トラックバックを送信しようとしたときに、エントリーが送信するトラックバック Ping の中身の一部となる、トラックバック元となるべき URL がパーマリンクにならずに、そのエントリーの(隠されたはずの)ファイル名である "index.html" がくっついたままの URL となっていたのだった。これでは、拡張子を含まないように苦労して工夫したはずのパーマリンクがまるで台無しだ。
そのことについての、追跡調査と、その対処方のメモ。
これでいちおう対処は出来たのだけれども、これによってほかのところに、影響はないだろうか、ちょっと不安がないこともない。でも、そのときは、そのときだ。
あるエントリーのエントリー・アーカイブを、そのエントリーのパーマリンクからチェックしてみる。すると、期待どおり、 "index.html" がついていない形になっている。これは、テンプレートに MTEntryPermalink タグが置かれていて、それが置換されているものだ。したがって、このパーマリンクにまちがいない。すると、トラックバック Ping を送信しようとする際に、内部的にそのコンテンツ・データを生成するときに、 MTEntryPermalink とは根本が違うところから、パーマリンクの情報を参照して来ているものかと思われた。
そこでまず、トラックバック Ping を生成しているところを探した。すると、 MT->ping メソッドのところで、トラックバック URL に向かって POST するための中身(コンテンツ)を生成していると思われるところがあった(注:トラックバックの動作をちゃんと追ったわけではないので、このような言い回しをしている) 。それを見てみると、パラメータ "url" のところにパーマリンクの URL が欲しいのだけれども、メソッド名から推測できることは、エントリーの permalink から情報を持って来ているようだった。──調べると言ってもメソッド名だけしか見ていないのだけれども、そこから思われることは、ちゃんとした出所からパーマリンクの情報を持って来ているようだ、ということだった。
push @qs, 'url=' . MT::Util::encode_url($entry->permalink);
出所がよさそうなら、その出所そのものが怪しい、ということになる。 MT::Entry->permalink が返す内容には既に "index.html" が含まれていることは十分疑われた。
ということで、 MT::Entry を見てみる。すると、 MT::Entry->permalink は MT::Entry->archive_url メソッドから URL の情報を持って来ている様子。では MT::Entry->archive_url は、なにを返すのかと見てみると、 MT::Entry->archive_file メソッドから持って来ている。で、その MT::Entry->archive_file は、 MT::Util->archive_file_for から...... これはちょっとつらい。
気分転換に、別の視点から見てみることにした。
エントリーのページでも、アーカイブのページでも、「パーマリンク」のリンクに、期待どおりの URL がセットされているので、それを置換しているタグを見てみた。それは MTEntryPermalink というタグもしくは MTArchiveLink 。
それらについては、 MT::Template::Context(ファイルは $MT_HOME/MT/Template/ContextHandlers.pm )の関数 _hdlr_entry_permalink もしくは _hdlr_archive_link が、タグに対して置換されるための文字列を生成している。
そのそれぞれは共に、最後のところで、 MT::Util::strip_index というそれっぽいユーティリティを使って、何かやっていた。設定ファイルから、 "IndexBasename" という項目を取り出していることからも、いよいよ怪しい。そこで、 "IndexBasename" の設定内容はと思って、 mt-config.cgi を開いてみたら、でも、 "IndexBasename" という項目は、書いていなかった(注:これを書けば、それが適用される模様)。ただし設定ファイルになければ、その場合は、MT::ConfigMgr が自動的にデフォルトを設定しているようだった。そう、 "index" と。いよいよ怪しくなって来た。
そのことを念頭に置いて、 MT::Util::strip_index をじーっと睨んでいると、どうやらここで "index.html" という文字列を取り除いているようだった。( "html" の部分は、 $blog->file_extention から持って来ている。つまり、 MT::Util::strip_index は、入力されたパスのファイル名部分に "index.*" があった場合、それを取り除くのだろう)。
だいたいの状況証拠は出そろった。ここで、もとの立ち位置に戻って、まとめてみる。
MTArchiveLink も MTEntryPermalink もどちらのタグも、期待するとおりの結果が得られていることから、このへんに問題はないことは、疑われない。いま問題となっているのは、トラックバックを送信するときの、 HTTP リクエストの中身だから、 MT->ping が犯人... ではなくて、 MT->ping にニセの情報(ニセ??)を渡す MT::Entry->permalink こそが真犯人だ(!)。
ということで、 MT::Entry->permalink が URL ( $url )を返す直前のところに、次のように書き加えた。 MTArchiveLink も MTEntryPermalink も、パーマリンクが欲しい所では strip_index をとおしているのだから、ここでも同様に strip_index にとおすように。
$url = MT::Util::strip_index($url,$blog);
こうして、とりあえず、自分自身にトラックバック。
あ、 BlogPeople にもやってみよう。昨日のエントリーで、この問題に気がつくきっかけになったところだった。
TB:アーカイブファイルパスの変更に伴ってのプチ改造 (Movable Type 4989)
TB:MultiViews のための拡張子戦争が終結 (drry+@->Weblog)