Redirect old forum URLs to new Discourse URLs using permalinks

Redirection des anciennes URL de forum vers les nouvelles URL Discourse à l’aide des permaliens

Si vous êtes passé d’un autre logiciel de forum à Discourse en utilisant l’un de nos scripts d’importation, vous voudrez probablement que tous vos résultats Google durement acquis continuent de pointer vers le même contenu. Discourse dispose d’un moyen intégré pour gérer cela pour vous, en alternative à la rédaction de règles nginx, en utilisant la table de correspondance des permaliens.

La table des permaliens vous permet de définir deux choses : une URL à faire correspondre et ce que cette URL doit afficher. Il existe quelques options pour définir vers où l’URL doit rediriger. Définissez l’une de celles-ci :

  • topic_id : pour afficher un sujet
  • post_id : pour afficher un message spécifique dans un sujet
  • category_id : pour afficher une catégorie
  • external_url : pour rediriger vers une URL qui n’appartient peut-être pas à votre instance Discourse

Par exemple, si les URL de vos sujets de forum d’origine ressemblaient à http://example.com/discussion/12345, et que l’URL de ce sujet après l’importation est http://example.com/t/nous-avons-deplace/987, vous pouvez alors configurer la correspondance comme suit :

cd /var/discourse
./launcher enter app
rails c
Permalink.create(url: '/discussion/12345', topic_id: 987)

Discourse effectuera alors une redirection avec le code d’état HTTP 301 (déplacé de façon permanente) vers la bonne URL pour le sujet id 12345. Le 301 devrait inciter les moteurs de recherche à mettre à jour leurs enregistrements et à commencer à utiliser les nouvelles URL.

Si vous souhaitez que certaines URL redirigent hors de Discourse, vous pouvez le faire en définissant external_url :

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

Informations supplémentaires

Pour trouver l’ID d’une sous-catégorie, vous pouvez la rechercher par son slug comme ceci :

Category.find_by_slug('products').id

Pour supprimer le permalien de cette URL, faites ceci :

Permalink.find_by_url("/blah").destroy

Il ne peut y avoir qu’un seul enregistrement de permalien par URL, alors recherchez simplement par URL.

Créer une carte de sujets de MyBB vers Discourse

Questions de redirection de Discourse vers WordPress

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

Normalisation des permaliens


Dernière révision par @SaraDev le 2022-06-03T20:00:00Z

37 « J'aime »

Est-il possible de stocker la règle de réécriture directement dans le cluster Docker de Discourse ? Il y a un serveur web qui gère le HTTP et le SSL, puis-je y ajouter quelque chose ?

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

Je ne vois pas comment cela peut fonctionner puisque nginx ne connaît pas les nouveaux identifiants de sujet. Les identifiants /threads doivent être convertis en identifiant de sujet Discourse.

Si j’appelle /threads/name.1234, il est réécrit en /t/name, puis il m’affiche le bon post, l’identifiant n’est pas utilisé à ce moment-là, je viens de tester cela.

Probablement seulement quand vous avez de la chance et que Discourse et votre ancien forum génèrent les mêmes slugs (et que le slug ne commence pas par un nombre), mais c’est probablement suffisant.

Si vous voulez changer NGINX comme vous le suggérez, vous pouvez regarder le modèle web dans discourse_docker pour voir comment changer la configuration nginx à l’intérieur du conteneur. Voici un exemple :

1 « J'aime »

Merci beaucoup, je pense que ce serait une distraction suffisante

dois-je apporter cette modification à chaque mise à jour ?

Non. Vous l’ajouterez à votre app.yml et il sera appliqué à chaque reconstruction.

Pour gagner du temps lors des tests, vous pourriez :

cd /var/discourse
./launcher enter app
apt update
apt-get install -y vim nano

Ensuite, utilisez vim ou nano pour modifier ce que vous voulez voir et vérifier qu’il fait ce que vous pensez (et économiser 10-20 minutes par reconstruction). Vous pouvez redémarrer nginx avec sv restart nginx.

Rien de ce qui précède n’a été testé, mais cela devrait être proche.

1 « J'aime »

Merci pour votre aide, j’ai ajusté la configuration nginx et cela fonctionne comme souhaité.

1 « J'aime »

où dans le app.yml cela doit-il être écrit pour que le nginx soit automatiquement ajusté ? dans la zone d’exécution des commandes personnalisées ?

car (\u003cunknown\u003e): found unknown escape character while parsing a quoted scalar si j’ajoute ceci :

  - 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;
      }"

Jetez un coup d’œil à Configurer Let’s Encrypt avec plusieurs domaines / redirections et utilisez la même chose que dans cet exemple qui s’ajoute à la configuration nginx.

Vous pouvez le placer dans le hook after_ssl (que vous ajouteriez) comme dans celui-ci.

J’ai toujours la même erreur, je pense que cela a quelque chose à voir avec ma mise en forme.

1 « J'aime »