Problema con los permalinks después de la migración

Hola,

Logré migrar con éxito un antiguo software de foro desarrollado internamente a Discourse.
Después de la importación de 24 horas de los 2 millones de registros, todo funciona a la perfección, excepto los enlaces permanentes.

Tengo aproximadamente 350.000 enlaces permanentes en la tabla de la base de datos de permalinks de Discourse. Todos están en minúsculas, por ejemplo: “forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html”.

Desafortunadamente, Google enlaza a “/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/” y recibo un error 404. :frowning:

¿Alguna sugerencia sobre cómo puedo convertir a minúsculas la URL de la solicitud antes de buscarla en la tabla de permalinks sin romper nada más? ¿No debería ser estándar realizar este tipo de conversión antes de la búsqueda?

¡Gracias por el excelente software!

Göks

¡Bienvenido! ¡Felicidades por llegar hasta aquí!

Creo que quieres crear una normalización de enlaces permanentes que descarte el identificador y genere enlaces que incluyan solo el ID del foro.

¿Lo único necesario para identificar el tema correcto es t140842-s1, verdad?

Hay otros importadores que hacen eso, aunque no estoy seguro de cuáles. ¿Quizás vBulletin? Pero si buscas en todos ellos la normalización, deberías encontrar mi ejemplo.

1 me gusta

Gracias por la respuesta rápida.

No sabía antes de la migración que la búsqueda distingue entre mayúsculas y minúsculas; de lo contrario, habría intentado tenerlo en cuenta y me habría asegurado de que la URL se guardara tal como estaba en el software anterior.

Pero ahora ya he completado la migración y el sitio está en producción. Así que, desafortunadamente, estoy buscando formas de solucionarlo.

Puedo identificar un tema por su ID, por lo que “/forum/t140842” sería suficiente. Mediante SQL, podría modificar el campo url en la tabla permalinks de esta manera, pero ¿entonces realizará la búsqueda y redirigirá? Realicé una prueba rápida y no funcionó.

Hay una opción para la normalización de permalinks en la configuración de Discourse, pero no entendí qué hace.

La normalización de enlaces permanentes reescribirá la URL antes de que coincida con el enlace permanente, por lo que puedes usarla para eliminar el identificador (slug). La descripción en la configuración lo explica, aunque quizás solo si ya lo entiendes. :man_shrugging:

Los IDs antiguos de los temas deberían estar en topicCustomField, por lo que deberías poder crear nuevos enlaces permanentes recorriendo esos valores. Luego, simplemente elimina los antiguos (o elimínalos todos una vez que estés convencido de que puedes generar los que necesitas).

Puedes buscar aquí y en otros importadores términos como “permalink” y “normalización” para encontrar algunos ejemplos (un método es usar grep -r). Si necesitas más ayuda y tienes presupuesto, puedo ayudarte la próxima semana.

1 me gusta

Bien, tengo esta solicitud

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

y una normalización de permalink en la configuración como

/t(\d*)/?$forum/t\1

lo que debería resultar en “forum/t140842” para la solicitud anterior.

Cuando agrego la URL “forum/t140842” a la tabla de permalinks de Discourse, no surte efecto.
¿Mis suposiciones son correctas? ¿Qué estoy pasando por alto?

Vas por buen camino. Esas cosas de las expresiones regulares pueden ser complicadas. Creo que necesitas forum/ al principio de tu enlace permanente.

Gracias por el esfuerzo. Lo aprecio.

En la configuración, he cambiado mi regex ahora a (quiero decir que la mía debería coincidir también con el ID del tema):

forum/t(\d*)/?$forum/t\1

Cuando agrego un nuevo permalink a la tabla con la URL “forum/t140842” y lo guardo… Discourse cambia la URL a “f?$forum/t140842”. O hay un error o no entiendo el concepto aquí.

:confused:

Tras seguir intentando con la normalización mediante expresiones regulares, no logré entender cómo funciona.
Usar el ejemplo de la descripción volvió a provocar resultados inesperados en el campo de la URL al agregar nuevos enlaces permanentes.

Cuando migré a Discourse, eliminé el prefijo www del dominio.
Esto me dio ahora la oportunidad de reescribir la URI en el servidor antiguo mediante la configuración de Apache y el archivo .htaccess para convertirla a minúsculas antes de redirigirla al nuevo servidor de Discourse. Esto de alguna manera resolvió mi problema por ahora.

No funcionó como se esperaba porque la parte del slug de la URL se generó en el script de migración de manera ligeramente diferente a como lo hacía el software antiguo.

Así que “normalicé” la URL por mi cuenta.

Agregar/generar URLs normalizadas (Tabla de enlaces permanentes de Discourse)

En el campo de la URL, transformar:

forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

o

forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

o

forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

en una URL simple que contenga solo el ID del tema antiguo:
forum/t140842

Esto se logra mediante un comando SQL que reescribe la URL utilizando la función REGEXP_REPLACE:

INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\d*)(-?.*)/(.*)','forum/t\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;

Reescribir solicitudes antiguas mediante .htaccess en el dominio antiguo

RewriteRule ^forum/t([0-9]*)(-?.*)/(.*)$ https://discourse-domain.com/forum/t$1 [R=301,L]

¿Qué ocurre aquí?

Google ha indexado y está enlazando a la URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html. Tuve la suerte de que esta solicitud llegara a un servidor Apache debido a un dominio diferente, lo que me permitió utilizar .htaccess para reescribirla fácilmente. Así que estoy reescribiendo esta solicitud a https://discourse-domain.com/forum/t140842. En la tabla de enlaces permanentes, añadí el registro forum/t140842 utilizando el enlace permanente ya existente con la URL completa con slug, mediante una expresión regular (véase arriba).

Espero que esto sirva de punto de partida a alguien más.

1 me gusta