À l'origine j'avais songé à réécrire les anciennes URL avec la nouvelle syntaxe à l'aide du module rewrite de Apache, soit quelque chose comme ça :

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index.php\?(.*)
RewriteRule .* /index.php/post/$1 [R=301,L]
# R=301 pour forcer une redirection HTTP permanente

À ma grande surprise, ça ne fonctionne pas : il semblerait que Apache ne voit pas la query string, ce qui est d'autant plus étonnant qu'en testant manuellement à l'aide d'un script PHP à l'arrache affichant le contenu de la variable d'environnement $_SERVER['REQUEST_URI'] l'URI apparait en entier – y compris la QS.

Admettons...

J'ai tenté une approche différente avec le raisonnement suivant : si on demande /index.php et que la QS non-nulle, on est dans le cas de figure d'une URI DC1-style et on doit donc la réécrire au "format" DC2, ce que j'ai transcrit de la manière suivante :

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index.php
RewriteCond %{QUERY_STRING} !=""
RewriteRule .* /index.php/post/ [R=301,QSA,L]
# QSA pour ajouter le contenu de la query string à l'URI

Là, j'y croyais à mort. Au moment de tester toutefois, j'ai eu la désagréable surprise de constater que cette configuration provoquait une boucle de redirection infinie. J'ai eu l'explication de cette improbable boucle en activant les logs du mod_rewrite :

[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (4) RewriteCond: input='/index.php' pattern='^/index.php' => matched
[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (4) RewriteCond: input='2005/05/26/246-dessin-sur-trottoirs' pattern='!=' => matched
[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (2) rewrite '/index.php' -> '/index.php/post/2005/05/26/246-dessin-sur-trottoirs'
[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (2) explicitly forcing redirect with http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs
[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (1) escaping http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs for redirect
[28/Mar/2009:23:15:12 +0100] [bouh.soolbox.com/sid#8323c10][rid#83bd598/initial] (1) redirect to http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs/?2005/05/26/246-dessin-sur-trottoirs [REDIRECT/301]
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (2) init rewrite engine with requested uri /index.php/post/2005/05/26/246-dessin-sur-trottoirs
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (4) RewriteCond: input='/index.php/post/2005/05/26/246-dessin-sur-trottoirs' pattern='^/index.php' => matched
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (4) RewriteCond: input='2005/05/26/246-dessin-sur-trottoirs' pattern='!=' => matched
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (2) rewrite '/index.php/post/2005/05/26/246-dessin-sur-trottoirs' -> '/index.php/post/2005/05/26/246-dessin-sur-trottoirs'
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (2) explicitly forcing redirect with http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (1) escaping http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs for redirect
[28/Mar/2009:23:15:13 +0100] [bouh.soolbox.com/sid#8323c10][rid#83b9588/initial] (1) redirect to http://bouh.soolbox.com/index.php/post/2005/05/26/246-dessin-sur-trottoirs/?2005/05/26/246-dessin-sur-trottoirs [REDIRECT/301]

MAIS! MAIS POURQUOI TU RAJOUTES le "?" EN PLUS DU CONTENU DE LA QUERY STRING NAHRDINE DE PUTAIN D'ENCULÉ D'TA RACE MAUDITE ???!!!

Bref, voilà donc la raison de la boucle infinie : manifestement Apache rajoute automatiquement le "?" précédant la QS, impliquant dans mon cas la présence d'une QS non-nulle à chaque analyse de l'URL ; à noter un comportement identique en utilisant la syntaxe suivante :

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index.php
RewriteCond %{QUERY_STRING} !=""
RewriteRule .* /index.php/post/%{QUERY_STRING} [R=301,L]

Je suis un peu à court d'idées pour le moment, peut-être que l'un de nos aimables visiteurs aura une solution parce que là, je n'en puis plus...