Redireccionamiento de URL antiguas de foros a nuevas URL de Discourse usando enlaces permanentes
Si has migrado desde otro software de foro a Discourse utilizando uno de nuestros scripts de importación, probablemente quieras que todos tus resultados de búsqueda de Google, por los que tanto has trabajado, sigan apuntando al mismo contenido. Discourse tiene una forma incorporada de manejar esto por ti como alternativa a escribir reglas de nginx, utilizando la tabla de búsqueda de enlaces permanentes (permalinks lookup table).
La tabla de enlaces permanentes te permite establecer dos cosas: una URL para que coincida y lo que esa URL debe mostrar. Hay algunas opciones para definir a dónde debe redirigirse la URL. Establece una de estas:
topic_id: para mostrar un tema
post_id: para mostrar una publicación específica dentro de un tema
category_id: para mostrar una categoría
tag_id: para mostrar una etiqueta
user_id: para mostrar un perfil de usuario
external_url: para redirigir a una URL que podría no pertenecer a tu instancia de Discourse
Por ejemplo, si las URL de los temas de tu foro original eran como http://example.com/discussion/12345, y la URL de ese tema después de la importación es http://example.com/t/we-moved/987, puedes configurar el mapeo de esta manera:
cd /var/discourse
./launcher enter app
rails c
Permalink.create(url: '/discussion/12345', topic_id: 987)
Discourse realizará entonces una redirección con el código de estado de respuesta HTTP 301 (movido permanentemente) a la URL correcta para el ID de tema 12345. El 301 debería hacer que los motores de búsqueda actualicen sus registros y comiencen a usar las nuevas URL.
Si quieres que algunas URL redirijan fuera de Discourse, puedes hacerlo estableciendo external_url:
Comportamiento importante para enlaces permanentes externos en URL de temas
Cuando se crea un enlace permanente external_url para una URL de tema de Discourse (por ejemplo, /t/some-slug/123) para redirigir a un sitio externo, ten en cuenta:
el tema original debe estar suavemente eliminado (no eliminado permanentemente)
el tema debe pertenecer a una categoría pública
Por qué: si el tema sigue activo, Discourse lo resuelve normalmente y no se utiliza la búsqueda de enlaces permanentes. Si el tema está en una categoría privada, las comprobaciones de permisos pueden devolver 404 antes de que se aplique la redirección del enlace permanente externo.
Esto es especialmente relevante para la navegación dentro de la aplicación (usuarios que han iniciado sesión), donde las rutas pueden solicitarse como JSON/XHR.
Información adicional
Para encontrar el ID de una subcategoría, puedes buscarlo por el slug de esta manera:
Category.find_by_slug('products').id
Para eliminar el enlace permanente para esa URL, haz esto:
Permalink.find_by_url("/blah").destroy
Solo puede haber un registro de enlace permanente por URL, así que simplemente busca por URL.
Creación de un mapa de temas de MyBB a Discourse
Preguntas sobre la redirección de Discourse a WordPress
Normalización de enlaces permanentes
Última revisión por @SaraDev el 2022-06-03T20:00:00Z
¿Es posible almacenar la regla de reescritura directamente en el clúster de Docker de Discourse? Hay un servidor web que se encarga de http y ssl, ¿puedo añadir algo allí?
Si llamo a /threads/name.1234, se reescribe a /t/name y luego me muestra la publicación correcta, el ID no se utiliza en ese momento, acabo de probarlo.
Probablemente solo cuando tengas suerte y Discourse y tu antiguo foro generen las mismas slugs (y la slug no empiece por un número), pero eso probablemente sea suficiente.
Si quieres cambiar NGINX como sugieres, puedes mirar la plantilla web en discourse_docker para ver cómo cambiar la configuración de nginx dentro del contenedor. Aquí tienes un ejemplo:
No. Lo agregarás a tu app.yml y se aplicará en cada reconstrucción.
Para ahorrar tiempo en las pruebas, podrías:
cd /var/discourse
./launcher enter app
apt update
apt-get install -y vim nano
Luego usa vim o nano para editar lo que quieras ver que haga lo que crees que hace (y ahorra 10-20 minutos por reconstrucción). Puedes reiniciar nginx con sv restart nginx.
Nada de lo anterior ha sido probado, pero debería estar cerca.