以前 "古いタイプのアーカイブを作る方法" で書いたとおり、Movable Type 3.2 系での個別記事の URL が /yyyy/mm/basename.html へ変わりました。
旧形式から新形式へのリダイレクタがないことから、旧 URL を維持できないので移行しませんでしたが、今回リダイレクタを書くことにより新形式への移行を行いました。
なお、この移行により、私のアイディアマラソンは、http://idea.woremacx.com/へと移動しました。
.htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://blog.woremacx.com/redir.cgi/$1 [L,R=301]
redir.cgi
#!/usr/bin/perl
use strict;
use DBI;
use CGI;
# if we get illegal param, just return $def
my $def = "http://blog.woremacx.com/";
sub query {
my $q = shift;
#just for me
# if (48 <= $q && $q <= 52) {
# $q += 5;
# }
my $dbh_1 = "DBI:mysql:database=dbname;host=localhost";
my $dbh = DBI->connect($dbh_1, "dbuser", "dbpass")
|| return $def;
my $sth = $dbh->prepare(<<"EOSQL") || return $def;
select
mt_entry.entry_created_on, mt_entry.entry_basename,
mt_blog.blog_site_url, mt_blog.blog_archive_url
from
mt_entry
left join
mt_blog on mt_blog.blog_id = mt_entry.entry_blog_id
where
entry_id = ?
EOSQL
;
$sth->execute($q) || return $def;
my $base;
my $path = "";
if (my @ref = $sth->fetchrow_array) {
my ($c, $b) = ($ref[0], $ref[1]);
my $d;
if ($c =~ /^(\d+)-(\d+)/) {
$d = "$1/$2/";
}
$base = $ref[2];
if ($ref[3] =~ m|http://|) { $base = $ref[3]; }
return "$base$d$b.html";
} else {
return $def;
}
}
sub main {
my $q = $ENV{PATH_INFO};
my $rel;
if ($q =~ m|^/archives/(\d{6}).html$|) {
$rel = query($1);
} elsif ($q =~ m|^/archives/(\d{4})_(\d{2}).html$|) {
$rel = "$def$1/$2/";
} else {
$rel = $def;
}
my $x = CGI->new();
print $x->redirect(
-location => $rel,
-status => 301,
);
}
&main;

Leave a comment