Rediriger les anciennes URL de forum vers les nouvelles URL de Discourse à l'aide de permaliens

Redirection des anciennes URL de forum vers les nouvelles URL Discourse à l’aide de 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 précieux résultats de recherche Google continuent de pointer vers le même contenu. Discourse dispose d’un moyen intégré pour gérer cela pour vous, comme alternative à l’écriture de règles nginx, en utilisant la table de recherche de permaliens.

La table de 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 où l’URL doit rediriger. Définissez l’une des options suivantes :

  • topic_id : pour afficher un sujet
  • post_id : pour afficher un message spécifique dans un sujet
  • category_id : pour afficher une catégorie
  • tag_id : pour afficher une étiquette (tag)
  • user_id : pour afficher un profil utilisateur
  • external_url : pour rediriger vers une URL qui pourrait ne pas appartenir à votre instance Discourse

Par exemple, si les URL de sujets de votre ancien forum ressemblaient à http://example.com/discussion/12345, et que l’URL de ce sujet après l’importation est http://example.com/t/we-moved/987, vous pouvez configurer le mappage 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 de statut de réponse http 301 (déplacé de façon permanente) vers l’URL correcte pour l’identifiant de sujet 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 soient redirigées loin 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’identifiant d’une sous-catégorie, vous pouvez la rechercher par son slug comme suit :

Category.find_by_slug('products').id

Pour supprimer le lien permanent pour cette URL, faites ceci :

Permalink.find_by_url("/blah").destroy

Il ne peut y avoir qu’un seul enregistrement de lien permanent par URL, il suffit donc de rechercher par URL.

Création d’une carte de sujets de MyBB à Discourse

Questions de redirection de Discourse vers WordPress

Normalisation des liens permanents


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 »