JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Cómo migrar fácilmente de dasBlog a BlogEngine.NET

NOTA 22/08/2011: La migración descrita en este artículo es valida para cualquier versión de BlogEngine superior a la 1.6, incluyendo la 2.0 y la última 2.5 que es multi-blog. Si vas a albergar varios blogs migrados debes prestar especial atención a la parte final de redirecciones.

Blog orangeLlevo haciendo mi blog desde Junio de 2004, es decir, hace casi 7 años. Lo inicié albergándolo dentro de un proyecto llamado GolemProject que estaba auspiciado por una Universidad (craso error), por lo que enseguida murió y tuve que albergarlo yo mismo en uno de nuestros servidores. En aquel entonces (2005) el sistema de blogging más interesante que había -escrito en .NET- me pareció que era dasBlog. Lo malo es que este proyecto está abandonado. su última versión salió hace dos años -en marzo de 2009- e incluso entonces no incluía ya ni la mitad de las cosas que se le suponen a un sistema de blogging moderno, por lo que era cuestión de tiempo (y de vencer la pereza) que acabase migrando a otro sistema.

Desde el verano pasado tengo mi otro blog no-técnico funcionando bajo BlogEngine.NET. Es un sistema mucho más potente, con más características de serie y más fácil de extender y adaptar a las propias necesidades. En muchos sentidos es lo más parecido a Wordpress que hay bajo la plataforma .NET. Aún le falta mucho para llegar al nivel de Wordpress pero es más que suficiente para casi cualquier cosa, sobre todo si sabes programar un poco, y me siento más cómodo trabajando en .NET que en PHP por razones obvias.

Como la migración de dasBlog a BlogEngine no es directa y tiene muchos detalles importantes me he decidido a recopilar en este post todos los pasos a seguir y retoques a hacer. Es un poco largo pero mejor explicarlo con detalle, ya que no hay ningún documento que yo conozca (en ningún idioma) que explique como hacerlo con todos estos detalles. Todo lo que leerás a continuación está sacado de mi experiencia práctica y de experimentar con el código de varias aplicaciones que menciono, así que espero que te pueda ayudar y ahorrarte mucho tiempo.

Migración y SEO

Antes de nada, una cuestión muy importante en los tiempos que corren: la optimización para buscadores (SEO).

Este blog, al llevar tantos años y ser tan específico, está muy bien posicionado en los buscadores y especialmente en Google. Hay ciertas cosas que buscas sobre ASP.NET que devuelven artículos del blog en los primeros resultados. Por ello es muy importante que al migrar de un sistema a otro las URLs se conserven o, que al menos, exista una redirección permanente (estatus HTTP 301) que le indique a las arañas de los buscadores que ha cambiado la ubicación. De esta forma no te penalizan y el blog seguirá bien posicionado.

No sólo eso, sino que hay muchísimos enlaces entrantes al blog desde otros blogs y páginas, por lo que si cambiasen las URL habría por ahí multitud de enlaces rotos (muy mala cosa).

Por estos motivos, una de las premisas básicas para hacer la migración es que el nuevo sistema debería ser capaz de redirigir a los mismos artículos/posts cuando vinieran desde un buscador o un enlace externo cualquiera.

Dado que los sistemas de URL entre dasBlog y BlogEngine son totalmente distintos la tarea no es directa ni mucho menos, pero con un poco de experimentación se puede conseguir y más adelante lo explico.

Ahora sí, vamos paso a paso a explicar cómo hacer la migración.

1.- Exportación desde dasBlog a BlogML

Lo primero que tenemos que hacer es migrar nuestros contenidos, comentarios, categorías, etc... desde dasBlog a un formato que sea fácil de incorporar al otro sistema.

Existe un estándar denominado BlogML que permite describir los contenidos y elementos de un blog de manera estándar. Hoy en día es muy popular y BlogEngine permite utilizarlo para exportar e importar contenidos. Disponemos de una aplicación llamada dasBlogML que nos permite hacer esta exportación desde dasBlog. La ha escrito un australiano y está albergada en MSDN Code .

Para utilizarla tenemos que tener acceso físico a la carpeta que alberga nuestro blog de dasBlog. Para ello o bien la ejecutamos en el servidor o bien copiamos todos los contenidos de la carpeta de dasBlog a nuestro equipo por FTP (dasBlog almacena sus contenidos en archivos XML en disco, por lo que no hay base de datos que mover).

Lanzamos la aplicación y es tan sencillo como decirle en qué carpeta está dasBlog y a qué archivo queremos migrar los datos:

DasBlog2BlogML

En este caso estoy exportando un blog que tenemos en la empresa (TheemailingExperience.com) y copiando sus contenidos en BlogML al archivo C:\ThEmEx.xml.

2.- Montar BlogEngine.NET

Descargamos la última versión de BlogEngine.NET desde CodePlex. Su instalación es muy sencilla, pues basta con descomprimir el archivo BlogEngine.NET 2.0 (web), asociarle un servidor virtual en IIS y otorgar permisos de escritura al usuario "Servicio de Red" en la carpeta App_Data dentro del mismo. Con esto ya está listo para funcionar con los ajustes por defecto. El usuario y clave de administración es "Admin/admin".

Yo, para la migración, remiendo montarlo en la máquina local porque una vez migrados los contenidos (proceso que será más rápido en local) aún quedan mucho que ajustar y afinar estéticamente para dejar el blog a nuestro gusto. De hecho tardé más en hacer esto que en arreglar los problemas de la migración de datos.

3.- Importar los datos BlogML

Accede a la administración de BlogEngine.NET y en el apartado de Configuración existe una pestaña en la parte inferior que se llaman "Importar y Exportar":

Importar
Pulsa para aumentar

Para la importación se ofrecen dos opciones: subir directamente el archivo con el BlogML o usar una pequeña aplicación de importación que se ejecuta con Click-Once dándole al botón disponible en la pantalla anterior. La primera opción nunca ha funcionado muy bien por lo que he optado por la segunda.

Al pulsar el botón se ejecuta una aplicación que nos ayuda a realizar la migración. Básicamente lo que hace es leer el BlogML e ir llamando a los métodos del servicio Web de importación que ofrece BlogEngine. La aplicación se nota que está hecha con prisa y es muy chapucera y sin ninguna ayuda. Por suerte está disponible el código fuente en Codeplex, por lo que examinarlo y ver qué hacía y por qué. De hecho pude comprobar que toda la parte de trasformación de rutas de imágenes está mal hecha y raramente te va a funcionar.

Por este motivo una de las premisas de las que estoy partiendo es que tu nuevo blog, una vez migrado, va a estar albergado en exactamente el mismo dominio que el anterior. De esta forma no tendremos que migrar las rutas de las imágenesya que para hacerlo bien habría que tocar bastante el código de este programa.

Para ejecutarlo debemos especificar los siguientes parámetros:

ImportarApp

· En el tipo de origen indicar BlogMl.

· La ruta donde hemos guardado el archivo .xml con el BlogML.

· En archivos e imágenes debemos indicar que se haga caso omiso a estos elementos, sino fallará.

· Hacemos caso omiso del parámetor "File Path" que sólo sirve para la migración de imágenes (que como he dicho falla).

· En la información de destino indicamos la URL del raíz del Blogengine.NET que acabamos de montar (yo lo monté en un IIS Express en el puerto 8080), así como el nombre y clave del administrador.

· Marcamos todas las opciones avanzadas, para evitar que se dupliquen posts, que se escriba el nombre del autor de los post y que sólo se publiquen los comentarios que estén aprobados explícitamente por nosotros.

¿Listo?

Pues no. si lo ejecutases ahora verías que quizá introduciría algunos post pero enseguida rompería con un error. Además el error te diría que las credenciales del blog no son válidas, pero en realidad no tiene nada que ver con eso.

El problema está en que hay  un bug en el método del servicio Web que importa los comentarios. En realidad, además de esto pasan otras cosas que no deberían pasar y que vamos a solucionar ahora mismo muy fácilmente.

4.- Retocar el servicio de importación

El código del servicio de importación está en el archivo BlogImporter.cs dentro de la carpeta App_Code.

Lo primero es solucionar el problema con loa importación de comentarios. El problema es muy tonto y es que el nombre del parámetro "postID" que se pasa como primer argumento al método AddComment en el servicio está mal. Este es el aspecto de este método tal y como vienen en BlogEngine:

Arreglar_AddComment_1

Debemos cambiar el nombre del parámetro "postId" por "postID" (las dos últimas letras en mayúsculas), así:

Arreglar_AddComment_2

 

Con esto ya funcionará correctamente la importación de los comentarios y no nos fallará el programa importador.

De todos modos aún quedan cosas por solucionar antes de volver a reintentar el proceso.

Lo siguiente que vamos a solucionar es la codificación de caracteres. Por defecto los caracteres no ASCII (por ejemplo las letras con tildes) en los títulos de los posts no se decodifican cuando se almacenan en el nuevo blog, por lo que se ven caracteres “raros” luego una vez finalizada la importación. Para evitarlo sólo debemos decodificar el HTML de los títulos justo antes de añadirlos al nuevo post, durante la importación, lo cual se consigue con un simple HtmlDecode.

La siguiente dificultad tiene que ver con lo que comentaba al principio de este texto sobre conservar las URL de algún modo para no perder enlaces entrantes y posicionamiento SEO. Los posts del blog poseen una propiedad llamada Slug que es el texto que se utilizará para generar su URL pública para que cualquiera pueda leerlos. En la importación por defecto los Slugs de los post se calculan automáticamente por parte de BlogEngine, mientras que en realidad en dasBlog estos Slugs son "retahilas” muy largas de números y letras (identificadores globales únicos o GUID, vamos). La URL típica de dasBlog es como esta:

http://www.miservidor.com/PermaLink,guid,da59f4ca-76eb-4622-949e-b4fd5fa.aspx

Debemos tratar de meter como Slug de los post importados el mismo GUID usado en el original, y así podríamos redirigir fácilmente. Para ello lo único que hay que hacer es añadir un código simple que determine el Slug/GUID del post original a partir de la URL y lo asigne al nuevo post, para lo cual sólo hay que recortar desde el último “/” hasta donde pone .aspx, así que el código es muy sencillo y el resultado total de retocar el método AddPost del servicio de importación (también en BlogImporter.cs) es este (he marcado en rojo los cambios):

Importacion_AddPost

5.- Asegurar la correcta redirección de URLs

Todavía persiste un problema, y es que aunque asignemos el mismo Slug a los post importados, hay ciertos caracteres que BlogEngine elimina y también recorta la longitud del Slug.

Por ello, si el Slug original era “PermaLink,guid,da59f4ca-76eb-4622-949e-b4fd5fa” el mismo tras ser importado con el código anterior queda como “PermaLinkaspxguid=da59f4ca-76eb-4622-949e-b4”.

Es decir, cambia “PermaLink,guid,” por “PermaLinkaspxguid=” y además le recorta los últimos 5 caracteres.

Además, en BlogEngine los posts se muestran dentro de la subcarpeta virtual “post”, de modo que la URL original anterior que estaba en:

http://www.miservidor.com/PermaLink,guid,da59f4ca-76eb-4622-949e-b4fd5fa.aspx

ahora pasaría a estar en:

http://www.miservidor.com/post/PermaLinkaspxguid=da59f4ca-76eb-4622-949e-b4.aspx

que se parece pero no es lo mismo. Así que para no perder enlaces tenemos que asegurarnos de que cuando entre una petición que va a las URLs antiguas lo enviaremos con una redirección permanente (estatus 301) a la nueva URL de los posts importados.

Lo mismo ocurre con las categorías que pasan de ser del estilo:

http://www.miservidor.com/CategoryView,category,MiCategoria.aspx

a ser de este estilo en BlogEngine:

http://www.miservidor.com/category/MiCategoria.aspx

Para conseguir estas transformaciones  simplemente añadiremos en Global.asax un gestor para el evento BeginRequest para interceptar las peticiones, y comprobaremos si la página solicitada apunta a una URL de las antiguas, haciendo en ese caso la redirección a la nueva. El código es muy sencillo y queda de esta manera:

Global_asax_BeginRequest
Pulsa para aumentar

¡Listo! A partir de este momento cuando llegue una petición a una de las URL antiguas se la redirigirá automáticamente a las nuevas y no se perderá posicionamiento ni enlaces entrantes.

6.- Gente que accede a través de RSS

Un detalle más a tener en cuenta es que mucha gente, en lugar de visitar el blog, suele acceder usando algún lector de RSS como Google Reader o el propio Outlook. En dasBlog la URL de los feed RSS es de este estilo:

http://www.miservidor.com/SyndicationService.asmx/GetRss

siendo la barra del final “/GetRSS” la que indica el formato en el que lo quieres descargar.

En BlogEngine la URL es simplemente:

http://www.miservidor.com/syndication.axd

y se ajusta el formato en el que quieres devolverlo desde la configuración.

Si queremos que la gente que no seguía a través de RSS no se encuentre con un feed que jamás se actualiza o que le da errores podemos añadir unas líneas más a Global.asax y dejarlo como se ve en la figura anterior (las tres últimas líneas).

A partir de este momento los que estén suscritos a través del anterior feed seguirán recibiendo las actualizaciones como si nada hubiese cambiado.

7.- Retoques finales

Para acabar con la migración es necesario conservar las imágenes anteriores o sino todas las imágenes y archivos para descarga del anterior blog aparecerán rotas en el nuevo. dasBlog guarda las imágenes y archivos dentro de la carpeta “content” por lo que lo único que tenemos que hacer es copiar su contenido a nuestro nuevo blog. En realidad sólo debes copiar la subcarpetas “Binary” que está dentro de “content”. Cópiala y se empezarán a ver de nuevo todas las imágenes antiguas.

Además, por defecto BlogEngine incorpora dos Categorías de posts llamadas “BlogEngine.NET” y “Blog”. Vete a la administración de páginas y en la pestaña “Categorías” búscalas y elimínalas para que no te aparezcan más.

Ahora sólo te resta dejar listo el apartado estético y de configuración básica de BlogEngine. Cuando lo tengas afinado en local sube la carpeta completa de BlogEngine al servidor, configura el servidor virtual, dale permisos de escritura a “Servicio de red” en la carpeta “App_Data” y ¡voilà!, tendrás tu nuevo blog migrado y listo para utilizar.

¡Espero que te sirva de ayuda!

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (7) -

Hola José.
Yo las redirecciones las he hecho modificando el .htaccess y creando un php, ya que las URL's no eran las mismas.

<?php
/*
En este archivo vamos a hacer todas las traducciones de las URL's para
que sean lo mas parecidas a la nuevas direcciones de esta manera google no nos penalizará.
*/

if(isset($_GET['o'])){ $opcion = $_GET['o']; } else { $opcion = ''; }

switch($opcion)
{
  case "news":
    if(isset($_GET['id'])){ $id = $_GET['id']; } else { $id = ''; }
    if(isset($_GET['name'])){ $name = str_replace(array('--','.',',','/'),array('-','','',''),str_replace('_','-',strtolower($_GET['name']))); } else { $name = ''; }
    header( "HTTP/1.1 301 Moved Permanently" );
    header('location: /smallville/news/'.$name.'_'.$id.'_es.html');
  break;
  case "temp":
    if(isset($_GET['temp'])){ $temp = $_GET['temp']; } else { $temp = ''; }
    header( "HTTP/1.1 301 Moved Permanently" );
    header('location: /smallville/temporada-'.$temp.'_es.html');
  break;
  case "ep":
    if(isset($_GET['temp'])){ $temp = $_GET['temp']; } else { $temp = ''; }
    if(isset($_GET['ep'])){ $ep = $_GET['ep']; } else { $ep = ''; }
    if(isset($_GET['name'])){ $name = str_replace(array('--','.',',','/'),array('-','','',''),str_replace('_','-',strtolower($_GET['name']))); } else { $name = ''; }
    header( "HTTP/1.1 301 Moved Permanently" );
    header('location: /smallville/temporada-'.$temp.'_episodio-'.$ep.'_'.$name.'_es.html');
  break;
}
?>

Responder

Hola Eduardo:

Pero es que me comentas lo has hecho para Wordpress ¿no? porque precisamente yo estoy usando BlogEngine para evitar tener que usar PHP...

Saludos,

Responder

Qué sigan los artículos con la nueva imagen del blog !!! salu2grz

Responder

muy interesante.

Posts sobre exportaciones sería interesantes y valorados, sugerencia por ejemplo: cómo exportar excel de Movistar e ING Direct (facturación) a una hoja de cálculo de Google Docs ??

Saludos !!!

Responder

Very good article I like your blog carry on the great articles =-=

Responder

Enhorabuena! es un artículo muy interesante!

Yo también uso BlogEngine y no se qué hora del servidor poner para el horario español en Configuración / Básica / Zona Horaria del servidor ¿Cual usais vosotros?

Gracias.

Responder

Spain José Manuel Alarcón

Hola Silvia,

Yo uso 0, ya que no está muy bien implementado y realmente lo que hace es sumarle o restarle a la hora del servidor la cantidad de horas que pongas ahí. Como mi servidor está en España y quiero la hora española le dejo 0 y siempre sale la hora correcta.

Saludos,

Responder

Agregar comentario