Problème avec les permaliens après la migration

Bonjour,

J’ai réussi à migrer avec succès un ancien forum développé en interne vers Discourse.
Après une importation de 24 heures portant sur 2 millions d’enregistrements, tout fonctionne parfaitement, à l’exception des permaliens.

Je dispose d’environ 350 000 permaliens dans la table de base de données permalinks de Discourse. Tous sont en minuscules, par exemple : « forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html ».

Malheureusement, Google pointe vers « /forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/ », ce qui me renvoie une erreur 404. :frowning:

Auriez-vous des pistes pour convertir l’URL de la requête en minuscules avant de la rechercher dans la table des permaliens, sans casser d’autres fonctionnalités ? Cette conversion avant recherche ne devrait-elle pas être standard ?

Merci pour ce formidable logiciel !

Göks

Bienvenue ! Félicitations pour être arrivé jusque-là !

Je pense que vous souhaitez créer une normalisation de permalien qui supprime l’identifiant de slug et génère des permaliens contenant uniquement l’ID du forum.

Tout ce qui est nécessaire pour identifier le bon sujet est t140842-s1, n’est-ce pas ?

Il existe d’autres importateurs qui font cela, bien que je ne sache pas lesquels. Peut-être vBulletin ? Mais si vous recherchez dans tous les fichiers la normalisation, vous devriez trouver un exemple.

1 « J'aime »

Merci pour votre réponse rapide.

Je ne savais pas avant la migration que la recherche était sensible à la casse ; sinon, j’aurais pris cela en compte et m’assurerais que l’URL était enregistrée exactement comme dans l’ancien logiciel.

Mais la migration est maintenant terminée et le site est en production. Je cherche donc malheureusement des solutions de contournement.

Je peux identifier un sujet par son ID, donc « /forum/t140842 » suffirait. Via SQL, je pourrais modifier le champ url dans la table permalinks de cette manière, mais cela fonctionnera-t-il pour la recherche et la redirection ? J’ai fait un test rapide et cela n’a pas fonctionné.

Il existe une option de normalisation des permaliens dans les paramètres de Discourse, mais je ne comprends pas ce qu’elle fait.

La normalisation des permaliens réécrira l’URL avant qu’elle ne corresponde au permalien, ce qui vous permet de l’utiliser pour supprimer l’identifiant de slug. La description dans les paramètres l’explique, mais peut-être uniquement si vous le comprenez déjà. :man_shrugging:

Les anciens identifiants de sujets devraient se trouver dans topicCustomField, vous devriez donc pouvoir créer de nouveaux permaliens en parcourant ceux-ci. Ensuite, supprimez simplement les anciens. (ou supprimez-les tous une fois que vous êtes convaincu que vous pouvez créer ceux que vous souhaitez).

Vous pouvez rechercher ici et dans les autres importateurs les termes permalien et normalisation pour trouver des exemples (grep -r est une méthode). Si vous avez besoin d’aide supplémentaire et disposez d’un budget, je peux vous aider la semaine prochaine.

1 « J'aime »

Bon, j’ai cette demande : https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

et une normalisation de permalien dans la configuration comme suit :

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

ce qui devrait aboutir à « forum/t140842 » pour la demande ci-dessus.

Lorsque j’ajoute l’URL « forum/t140842 » à la table des permaliens de Discourse, cela ne produit aucun effet.
Mes hypothèses sont-elles correctes ? Qu’est-ce que je rate ?

Vous êtes sur la bonne voie. Ces expressions régulières peuvent être délicates. Je pense qu’il vous faut forum/ au début de votre permalien.

Merci pour vos efforts. Je vous en suis reconnaissant.

Dans la configuration, j’ai modifié mon expression rationnelle en (je veux dire que la mienne devrait également correspondre à l’ID du sujet) :

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

Lorsque j’ajoute un nouveau permalien dans le tableau avec l’URL “forum/t140842” et que je l’enregistre… Discourse modifie l’URL en “f?$forum/t140842”. Soit il y a un bug, soit je ne comprends pas le concept ici.

:confused:

Après avoir tenté à nouveau la normalisation par regex, je n’ai pas réussi à comprendre comment cela fonctionne. L’utilisation de l’exemple fourni dans la description a de nouveau provoqué des résultats inattendus dans le champ URL lors de l’ajout de nouveaux permaliens.

Lors de ma migration vers Discourse, j’ai supprimé le préfixe www du nom de domaine. Cela m’a maintenant permis de réécrire l’URI sur l’ancien serveur via la configuration Apache et le fichier .htaccess pour le mettre en minuscules avant de rediriger vers le nouveau serveur Discourse. Cela a résolu mon problème pour l’instant.

Cela n’a pas fonctionné comme prévu car la partie slug de l’URL a été générée dans le script de migration légèrement différemment par rapport à l’ancien logiciel.

J’ai donc « normalisé » l’URL moi-même.

Ajouter/générer des URLs normalisées (Table des permaliens Discourse)

Dans le champ URL, récupérer :

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

ou

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

ou

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

et les convertir en une URL simple ne contenant que l’ID de l’ancien sujet :
forum/t140842

Cela est réalisé par une commande SQL qui réécrit l’URL via la fonction 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;

Réécrire les anciennes requêtes via .htaccess sur l’ancien domaine

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

Que se passe-t-il ici ?

Google a indexé et pointe vers l’URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html. J’ai eu la chance que cette requête aboutisse sur un serveur Apache en raison d’un domaine différent, ce qui m’a permis d’utiliser .htaccess pour une réécriture simple. Je réécris donc cette requête vers https://discourse-domain.com/forum/t140842. Dans la table des permaliens, j’ai ajouté cet enregistrement forum/t140842 en utilisant le permalien déjà existant avec l’URL complète comportant le slug, grâce à une expression régulière (voir ci-dessus).

J’espère que cela aidera quelqu’un d’autre comme point de départ.

1 « J'aime »