I used to spit out individual entry archives into files named after each entries id.

For example, entry 300 was located at /blog/archives/entries/0003000/. I’ve since moved to using the entry title as the file name, so I have to figure out how to redirect the old links to the new locations. The easiest way to do this seems to be a quick and dirty mod_rewrite and a CGI script.

Here’s the RedirectMatch directive:


RewriteEngine   on
RewriteRule     ^/blog/archives/entries/([0-9]{1,6})(/|\.xsp)$  /cgi-bin/mt-byid.cgi?entry_id=$1 [R=301,L]

And here’s the CGI itself:


#!/usr/bin/perl -wT
use strict;

my($MT_DIR);
BEGIN {
    if ($0 =~ m!(.*[/\\])!) {
        $MT_DIR = $1;
    } else {
        $MT_DIR = './';
    };
    unshift @INC, $MT_DIR . 'lib';
    unshift @INC, $MT_DIR . 'extlib';
    push @INC, $MT_DIR . 'plugins';
};

eval {
        use CGI;
        use MT;
        use MT::Entry;

        my $permalink;
        my $query = CGI->new;
        my $entry_id = $query->param('entry_id');

        if ($entry_id !~ /^\d{1,6}$/) {
                $entry_id = 0;
        };

        my $mt = MT->new;
        my $entry = MT::Entry->load({id => $entry_id});
        if ($entry) {
                $permalink = $entry->permalink('Individual');
        } else {
                $permalink = '/404.icf';
        };

        print $query->redirect( -uri=>$permalink,
                                -status=>'301 Moved Permanently'
        );
};

if ($@) {
    print "Content-Type: text/html\n\n";
    print "Got an error: $@";
};
See more posts about: perl | All Categories