Redirect old forum URLs to new Discourse URLs using permalinks

Redireccionar URLs antiguas de foros a URLs nuevas de Discourse usando permalinks

Si te has mudado de otro software de foro a Discourse utilizando uno de nuestros scripts de importación, entonces probablemente querrás que todos tus resultados de búsqueda de Google ganados con tanto esfuerzo sigan apuntando al mismo contenido. Discourse tiene una forma integrada de manejar esto por ti como alternativa a escribir reglas de nginx, utilizando la tabla de búsqueda de permalinks.

La tabla de permalinks te permite configurar dos cosas: una URL a coincidir y qué debe mostrar esa URL. Hay algunas opciones para definir a dónde debe redirigir la URL. Configura 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
  • external_url: para redirigir a una URL que puede no pertenecer a tu instancia de Discourse

Por ejemplo, si las URLs de los temas de tu foro original se veían 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, entonces 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 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 URLs.

Si quieres que algunas URLs redirijan fuera de Discourse, puedes hacerlo configurando external_url:

Permalink.create(url: '/discussion/12345', external_url: 'http://archived.example.com/discussion/12345')

Información Adicional

Para encontrar el ID de una subcategoría, puedes buscarla por su slug de esta manera:

Category.find_by_slug('products').id

Para eliminar el permalink de esa URL, haz esto:

Permalink.find_by_url("/blah").destroy

Solo puede haber un registro de permalink por URL, así que simplemente busca por URL.

Creación de un mapa de temas de MyBB a Discourse

Preguntas de redirección de Discourse a WordPress

https://meta.discourse.org/t/discourse-to-wordpress-redirect-questions/87031

Normalización de Permalinks


Última Revisión por @SaraDev el 2022-06-03T20:00:00Z

37 Me gusta

¿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í?

location /threads/ {
    rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
}

No veo cómo eso puede funcionar, ya que nginx no conoce los nuevos ID de tema. Los ID de /threads deben convertirse al ID de tema de Discourse.

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:

1 me gusta

muchas gracias, creo que sería suficiente distracción

¿tengo que hacer este cambio con cada actualización?

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.

1 me gusta

Gracias por la ayuda, he ajustado la configuración de nginx y funciona como se desea.

1 me gusta

¿dónde en el app.yml debe escribirse esto para que el nginx se ajuste automáticamente? ¿en el área de ejecución para los comandos personalizados?

porque (\u003cunknown\u003e): se encontró un carácter de escape desconocido al analizar un escalar entrecomillado si agrego esto:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "# auth_basic_user_file /etc/nginx/htpasswd;"
      to: "# auth_basic_user_file /etc/nginx/htpasswd;

      location /threads/ {
          rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
      }"

Echa un vistazo a Configurar Let’s Encrypt con varios dominios/redirecciones y utiliza el mismo tipo de configuración que en ese ejemplo que se añade a la configuración de nginx.

Puedes ponerlo en el hook after_ssl (que añadirías) como en ese ejemplo.

Todavía obtengo el mismo error, creo que tiene algo que ver con mi formato.

1 me gusta