先日、SQLiteに変更したときに、ファイル名の形式を変更しました。
まぁそれでなくても、MT3.2からはarchivesというディレクトリが廃止されて、
デフォルトのディレクトリ名が変更になっているわけですが、
それにともなって、大量のNOT FOUNDが発生してしまいました。
例えば検索エンジンにインデックスされてるファイル名は
そう簡単に変えられませんからねぇ…

そういうわけで、しばし放置していたんですが、
思いついて、移行用のギミックを作ってみました。
必要なのは以下の3つ。

DB用インデックステンプレート .htaccess(mod_rewrite) 移行用プログラム

言ってみれば、Taggingの時の、x-search.cgiに飛ばすやり方の応用なんですけどね。

1) DB用インデックステンプレート
まず、インデックステンプレートを用意します。 僕の場合、古いファイルは、
/mutter/archives/yyyymm/ddhhii.php

という形式でした。一方で新しいファイルは、

/mutter/yyyy/mm/dd/hhiiss.php

という形式です。そういうわけで、この二つの形式をTABを挟んで併記します。

<$MTEntryDate format="%Y%m/%d%H%M"$> <$MTEntryDate format="%Y/%m/%d/%H%M%S"$>

これを保存し、再構築。
一回作成すれば十分なので、再構築オプションはオフにしておいてOK。
(author_nameは適宜変更のこと)

2) .htaccess(mod_rewrite)
基本的には、プログラムに旧ファイル名を渡せればよいので、それほど複雑にはなりません。
RewriteRule ^archives/(.*)/(.*)\.php$ /home/nobodyplace/www/mutter/archives/tr.php?oldname1=$1&oldname2=$2 [QSA,L]

旧ファイル名のスラッシュの前後で二つに区切り、
tr.phpと言うプログラムの引数として渡しています。
これを、archivesディレクトリと同じディレクトリにアップロード。


3) 移行用プログラム

最後はプログラム。
旧ファイル名で検索を掛けて、新ファイル名を取得し、
その場所へ転送してやることが役割です。

<?php $OldName = $_REQUEST['oldname1'] . "/" . $_REQUEST['oldname2'];        // 旧ファイル名の取得 $NewName = getNewName($OldName);                                    // 新ファイル名の取得

$NewFile = "http://www.nobodyplace.com/mutter/" . $NewName . ".php";

header("Location: $NewFile");


#-----------------------------------------------------------#
# 変換ファイルオープン -> 新ファイル名の取得                #
#-----------------------------------------------------------#

function getNewName($OldName){

    $FILE = "./tr_filename.dat";

    $fh = fopen($FILE,"r");
    flock($fh, LOCK_EX);
    while(!feof($fh)){
        $buf = trim(fgets($fh));
        if($buf){
            $FileNames = explode("\t",$buf);
            if($FileNames[0] == $OldName){
                return $FileNames[1];
            }
        }
    }
    flock($fh, LOCK_UN);
    fclose($fh);

    return "";
}
?>

これをアップロードして完了。

旧ファイル名でアクセスすると、
自動的に新しい場所へ飛ばされます。

やっぱものは考えようだよなぁ…

ちなみに、いつまでも検索エンジンのインデックスが更新されない恐れはあります…
諦めて301(Moved Permanently)の方が良いのかもしれません。