El problema que se plantea para migrar de phpbb a SMF no consiste únicamente en recuperar la base de datos y la estructura del foro sino también respetar los enlaces antiguos. En el entorno real el foro phpbb2 estaba instalado y funcionando en http://foro.migui.com/phpbb y en su momento me planteé su migración a http://foro.migui.com/smf. Tras hacer varias pruebas en local me decidí a parar el foro, hacer backup de la base de datos e instalar SMF. Se supone que hemos llegado a este punto.
Lo bueno que tiene SMF es que es capaz de migrar la base de datos perfectamente sin perder nada. Aunque si tenemos modificaciones en la estructura de la base de datos, éstas podrían no verse reflejadas porque el conversor hace una conversión partiendo de la base de que el phpBB es el estándar sin modificaciones adicionales. Lo único malo es que tendremos que reconstruir los emoticonos y los rangos porque aunque el conversor los migra, dado que SMF los trata de manera diferente y personalizada hay que retocarlo luego en el panel de administrador.
Arreglar enlaces internos:
Así que una vez haya terminado el conversor tendremos el nuevo foro SMF con los datos del viejo. Pero es en este momento cuando nos damos cuenta de que los enlaces internos del antiguo phpbb y que referían a la antigua localización ahora reportan error 404. Pero no todo está perdido. Basta con guardar el siguiente código en un fichero .php y subirlo al directorio raíz del foro. En mi caso, en smf/ se copia esto en el directorio. Seleccionar, copiar y pegar tal cual. Aunque se ve más estrecho por el formato del foro, el código está comprobado que funciona.
{xtypo_code}
<?php
require_once('SSI.php');
$_REQUEST['start'] = (int) @$_REQUEST['start'];
$from_url = 'http://foro.migui.com/phpbb';
$replace = array(
'~' . preg_quote($from_url . '/index.php', '~') . '~' => $scripturl,
'~' . preg_quote($from_url . '/faq.php', '~') . '~' => $scripturl . '?action=help',
'~' . preg_quote($from_url . '/search.php', '~') . '~' => $scripturl . '?action=search',
'~' . preg_quote($from_url . '/memberlist.php', '~') . '~' => $scripturl . '?action=mlist',
'~' . preg_quote($from_url . '/profile.php?mode=editprofile', '~') . '~' => $scripturl . '?action=profile',
'~' . preg_quote($from_url . '/privmsg.php?folder=inbox', '~') . '~' => $scripturl . '?action=pm',
'~' . preg_quote($from_url . '/privmsg.php?folder=outbox', '~') . '~' => $scripturl . '?action=pm;f=outbox',
'~' . preg_quote($from_url . '/privmsg.php?folder=sentbox', '~') . '~' => $scripturl . '?action=pm;f=outbox',
'~' . preg_quote($from_url . '/privmsg.php?folder=savebox', '~') . '~' => $scripturl . '?action=pm',
'~' . preg_quote($from_url . '/privmsg.php?mode=post', '~') . '~' => $scripturl . '?action=pm;sa=send',
'~' . preg_quote($from_url . '/profile.php?mode=register', '~') . '~' => $scripturl . '?action=register',
'~' . preg_quote($from_url . '/login.php', '~') . '~' => $scripturl . '?action=login',
'~' . preg_quote($from_url . '/viewforum.php?f=', '~') . '([\d]+)&st=([\d]+)~' => $scripturl . '?board=$1.$2',
'~' . preg_quote($from_url . '/viewforum.php?f=', '~') . '([\d]+)~' => $scripturl . '?board=$1.0',
'~' . preg_quote($from_url . '/viewtopic.php?t=', '~') . '([\d]+)~' => $scripturl . '?topic=$1.0',
'~' . preg_quote($from_url . '/viewtopic.php?t=', '~') . '([\d]+)&st=([\d]+)~' => $scripturl . '?topic=$1.$2',
'~' . preg_quote($from_url . '/posting.php?mode=newtopic&f=', '~') . '([\d]+)~' => $scripturl . '?action=post;board=$1.0',
'~' . preg_quote($from_url . '/posting.php?mode=reply&t=', '~') . '([\d]+)~' => $scripturl . '?action=post;topic=$1.0',
);
$from = array_keys($replace);
$to = array_values($replace);
while (true)
{
$request = db_query("
SELECT ID_MSG, body
FROM {$db_prefix}messages
LIMIT $_REQUEST[start], 20", __FILE__, __LINE__);
if (mysql_num_rows($request) == 0)
break;
while ($row = mysql_fetch_assoc($request))
db_query("
UPDATE {$db_prefix}messages
SET body = '" . addslashes(preg_replace($from, $to, $row['body'])) . "'
WHERE ID_MSG = $row[ID_MSG]
LIMIT 1", __FILE__, __LINE__);
mysql_free_result($request);
$_REQUEST['start'] += 20;
}
?>{/xtypo_code}
Este proceso puede tardar varias horas dependiendo del tamaño que tenga la base de datos. Si quieres asegurarte, para el foro mientras tanto por ejemplo por la noche y al final, comprobarás cómo todos los enlaces viejos ahora están bien referidos.
Arreglar enlaces externos rotos:
La segunda parte mala de migrar los datos es que Google te castigará si tienes muchos links rotos y eso se verá reflejado en tu PageRank. Si no quieres que te pase esto o al menos minimizar el impacto en tu posicionamiento, entonces basta con editar el fichero .htaccess e incluir lo siguiente:
{xtypo_code}
RewriteEngine On
RewriteCond %{QUERY_STRING} ^f=([0-9]+).*$
RewriteRule ^phpbb/viewforum.php$ /smf/index.php?board=%1.0 [R=301,L]
#
RewriteCond %{QUERY_STRING} ^t=([0-9]+).*$
RewriteRule ^phpbb/viewtopic.php$ /smf/index.php?topic=%1.0 [R=301,L]
#
RewriteCond %{QUERY_STRING} ^mode=viewprofile&u=([0-9]+)$
RewriteRule ^phpbb/profile.php$ /smf/index.php?action=profile;u=%1 [R=301,L,NE]
#
RewriteRule ^phpbb/search.php$ /smf/index.php?action=search [R=301,L]
RewriteRule ^phpbb/profile.php$ /smf/index.php?action=profile [R=301,L]
RewriteRule ^phpbb/faq.php$ /smf/index.php?action=help [R=301,L]
RewriteRule ^phpbb/privmsg.php$ /smf/index.php?action=pm [R=301,L]
RewriteRule ^phpbb/memberlist.php$ /smf/index.php?action=mlist [R=301,L]
RewriteRule ^phpbb/viewonline.php$ /smf/index.php?action=who [R=301,L]{/xtypo_code}
En este caso el foro viejo era phpbb/ y el nuevo smf/ y esto debe ser cambiado según las necesidades de cada uno. Ahora ya podemos comprobar como en la mayoría de los casos, los enlaces antiguos son correctamente redirigidos al nuevo foro.
Y esto es todo amigos.






