Le cadre de la migration

Changement d'hébergeur, donc de serveur. J'ai un accès complet au serveur, je peux y faire ce que je veux dans la limite de l'espace disque. Je peux notamment y exécuter mes propres programmes pour la migration, s'il le faut (et il l'a fallu).

Récupération du contenu existant

Là, rien à dire sur la documentation de migration DC1 vers DC2. Sauf que je suis un chieur. Je vous conseille[1] de détruire le premier billet d'exemple avant de procéder à l'importation des données issues de l'ancien blog. Et de compacter la base (Extensions>Maintenance).

Pour le reste, c'est nickel, tant du point de vue de l'export des anciennes données (merci Pep pour flatExport[2]) que pour l'import dans le nouveau blog.

Récupération des images

Sous DC1 (en tout cas dans ma configuration), les images étaient dans /images/. Sous DC2, il semble que ce doive être sous /public/. Evidemment, on pourrait changer la configuration pour conserver une comptabilité ascendante, mais ce genre de truc m'a toujours donné de l'urticaire : le passé est le passé, important certes, mais s'il faut toujours trimbaler les valises d'hier on n'arrivera jamais à demain. Donc, mes images seront sous /public/.

Le transfert per se ne pose pas de problème, un coup de tar jcf / scp / tar jxf et le répertoire /public/ est correctement rempli. Reste à modifier les liens dans les billets, liens qui font référence à /images/. Apache permet de faire ça sans difficulté, par une redirection (dans le fichier httpd.conf[3], pour moi dans la section VirtualHost adéquate) :

RedirectPermanent   /images/    http://www.nuitsdechine.org/public/

et c'est plié.

Fils RSS et autres

(ajout suite au commentaire d'Eulalie)

Dans la même idée que les images, les fils RSS (commentaires et autres) ne sont plus aux mêmes URLs. Quelques redirections plus tard, c'est invisible pour le visiteur :

RedirectPermanent   /rss.php   http://www.nuitsdechine.org/index.php/feed/rss2
RedirectPermanent   /atom.php   http://www.nuitsdechine.org/index.php/feed/atom

Mise en place des liens internes

Je n'aime pas que les liens vers mes billets contiennent le titre : c'est trop long, nous sommes dans un monde en crise, il faut économiser les caractères et les électrons. La configuration de DC2 est donc modifiée pour que les URLs des nouveaux billets soient sous la forme AAAA/MM/JJ/NN, où NN est le numéro du billet. Ca, ça marche pour les nouveaux billets mais pas pour les anciens, qui sont identifiés sous DC2 par une URL de la forme AAAA/MM/JJ/NN-titre.

Je n'ai pas trouvé, dans DC2, de moyen d'obtenir directement le résultat que je veux. Ca doit se situer entre flatExport et l'importation, mais je n'ai aucune envie d'aller tripatouiller le code, d'autant plus que j'ai une solution facile : ayant accès au système, je peux écrire un minuscule bout de code qui va aller corriger les URLs des billets existants. Quelques lignes en Perl :

use DBI;

$dsn = "DBI:mysql:database=ma_base_de_données" ;
$dbh = DBI->connect($dsn, 'le_compte', 'Le mot de passe')
or die "Probleme connexion";

$sth = $dbh->prepare("SELECT post_id, blog_id, post_url
FROM dc_post");
$sth->execute;
$modif = $dbh->prepare ("UPDATE dc_post set post_url = ?
where post_id = ?")
or die "Probleme préparation modif\n";

while (my $ref = $sth->fetchrow_hashref()) {
$modif->execute($1, $ref->{'post_id'})
if $ref->{'post_url'} =~
m/(\d{4}\/\d\d\/\d\d\/\d+)-.*$/ ;
}

$dbh->disconnect;

et c'est aussi plié.

Sauf qu'il demeure encore un problème : les URLs DC2 sont en réalité de la forme /index.php/post/AAAA/..., alors que sous DC1 (et sous DC2 si je m'arrête à la modification ci-dessus) on a /index.php/AAAA/... Il faut insérer un post entre le index.hp et l'année. De même, plein d'autres URLs ''à la DC1'' doivent être réécrites pour DC2 (elles ont été indexées par des moteurs de recherche).
De nouveau, Apache (mod_rewrite) vient à la rescousse. Toujours dans la section VirtualHost adéquate :

RewriteEngine On
RewriteRule ^/index.php/(\d{4}/\d\d)(/\d\d)?$             /index.php/archive/$1 [R,L]
RewriteRule ^/index.php/(\d{4}/\d\d/\d\d/\d+)(-.*)?$  /index.php/post/$1 [R,L]
RewriteRule ^/index.php/(.*-.*)/(\d{4}/\d\d)(/\d\d)?$  /index.php/archive/$2 [R,L]
RewriteRule ^/index.php/([A-Z][^/]*)$                          /index.php/category/$1  [R,L]
RewriteRule ^/index.php/(\d{4}/\d\d)/p\d+$               /index.php/archive/$1   [R,L]

Et, enfin, c'est réellement plié. Il me reste à chrooter tout ça, mais ça ne concerne plus Dotclear, comme je l'ai dit en introduction.

Notes

[1] Sans être certain que c'est utile, je le concède.

[2] Je ne mets pas de lien vers ce plugin, au cas où une nouvelle version sorte; tout est dans la doc de migration DC1 vers DC2.

[3] Ca pourrait être placé dans un .htaccess si vous n'avez pas la possibilité d'agir sur le httpd.conf