Problem mit Permalinks nach der Migration

Hallo,

ich habe es geschafft, eine selbst entwickelte Legacy-Forum-Software erfolgreich zu Discourse zu migrieren. Nach dem 24-stündigen Import von 2 Millionen Datensätzen funktioniert alles wie am Schnürchen – bis auf die Permalinks.

In der Permalinks-Datenbanktabelle von Discourse habe ich etwa 350.000 Einträge. Alle sind in Kleinbuchstaben, zum Beispiel: „forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html".

Leider verlinkt Google auf „/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/", was einen 404-Fehler zur Folge hat. :frowning:

Habt ihr einen Tipp, wie ich die angeforderte URL vor dem Abgleich mit der Permalinks-Tabelle in Kleinbuchstaben umwandeln kann, ohne dabei andere Funktionen zu beschädigen? Sollte eine solche Umwandlung vor dem Abgleich nicht Standard sein?

Vielen Dank für die großartige Software!

Göks

Willkommen! Herzlichen Glückwunsch, dass du es so weit geschafft hast!

Du möchtest eine Normalisierung für Permalinks erstellen, die den Slug verwirft und Permalinks erstellt, die nur die Forum-ID enthalten, oder?

Alles, was zur Identifizierung des richtigen Themas benötigt wird, ist t140842-s1, richtig?

Es gibt einige andere Importer, die das tun, obwohl ich nicht genau weiß, welche. Vielleicht vBulletin? Aber wenn du sie alle nach Normalisierung durchsuchst, solltest du ein Beispiel finden.

1 „Gefällt mir“

Danke für die schnelle Antwort.

Ich wusste vor der Migration nicht, dass die Suche case-sensitiv ist – sonst hätte ich versucht, dies zu berücksichtigen und dafür gesorgt, dass die URL so gespeichert wurde, wie sie in der alten Software war.

Aber ich bin jetzt nach der Migration und die Seite ist produktiv. Leider suche ich also nach Möglichkeiten, dies zu umgehen.

Ich kann ein Thema an seiner ID identifizieren, also wäre “/forum/t140842” ausreichend. Über SQL könnte ich das URL-Feld in der Tabelle permalinks so ändern, aber wird es dann suchen und weiterleiten? Ich habe einen schnellen Test gemacht, und es hat nicht funktioniert.

Es gibt eine Option zur Normalisierung von Permalinks in den Discourse-Einstellungen – aber ich habe nicht verstanden, was diese bewirkt.

Die Permalink-Normalisierung schreibt die URL um, bevor sie auf den Permalink trifft, sodass du sie verwenden kannst, um den Slug zu entfernen. Die Beschreibung in den Einstellungen erklärt dies, aber vielleicht nur, wenn du es bereits verstehst. :man_shrugging:

Die alten Topic-IDs sollten in topicCustomField stehen, sodass du neue Permalinks erstellen kannst, indem du diese durchläufst. Lösche dann einfach die alten. (Oder lösche alle, sobald du überzeugt bist, dass du die gewünschten erstellen kannst).

Du kannst hier und in den anderen Importern nach „permalink“ und „normalization“ suchen, um einige Beispiele zu finden (grep -r ist eine Möglichkeit). Wenn du weitere Hilfe brauchst und ein Budget hast, kann ich nächste Woche unterstützen.

1 „Gefällt mir“

Alright, so I have this request

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

and one permalink normalization in the configuration like

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

which should result in “forum/t140842” for the request above.

When I add the url “forum/t140842” to the discourse permalinks table it shows no effect?
Are my assumptions correct? What do I miss out?

Du bist auf dem richtigen Weg. Diese Regex-Sache kann knifflig sein. Ich denke, du brauchst forum/ am Anfang deiner Permalink-URL.

Danke für die Mühe. Ich schätze das.

In der Konfiguration habe ich meine Regex nun geändert (ich meine, sie sollte auch die Themen-ID erfassen):

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

Wenn ich einen neuen Permalink mit der URL “forum/t140842” in die Tabelle hinzufüge und speichere, ändert Discourse die URL zu “f?$forum/t140842”. Entweder liegt ein Fehler vor, oder ich verstehe das Konzept hier nicht.

:confused:

Nach weiteren Versuchen mit der Regex-Normalisierung konnte ich nicht herausfinden, wie das funktioniert. Die Verwendung des Beispiels in der Beschreibung führte erneut zu unerwarteten Ergebnissen im URL-Feld beim Hinzufügen neuer Permalinks.

Beim Wechsel zu Discourse habe ich das www-Präfix der Domain entfernt. Das gab mir nun die Möglichkeit, die URI auf dem alten Server über die Apache-Konfiguration und .htaccess in Kleinbuchstaben umzuschreiben, bevor sie auf den neuen Discourse-Server weitergeleitet wird. Das hat mein Problem vorerst gelöst.

Es hat nicht wie erwartet funktioniert, da der Slug-Teil der URL im Migrations-Skript leicht anders generiert wurde als in der alten Software.

Daher habe ich die URL selbst „normalisiert".

Normalisierte URLs hinzufügen/erstellen (Discourse Permalinks-Tabelle)

Im URL-Feld von

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

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

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

zu einer einfachen URL, die nur die ID des alten Themas enthält:
forum/t140842

Dies wird mit einem SQL-Befehl erledigt, der die URL über die Funktion REGEXP_REPLACE umschreibt:

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;

Alte Anfragen über .htaccess auf der alten Domain umschreiben

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

Was passiert hier genau?

Google hat die URL https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html indexiert und verlinkt. Ich hatte Glück, dass diese Anfrage aufgrund einer anderen Domain auf einem Apache-Server landete, sodass ich .htaccess zur einfachen Umleitung nutzen konnte. Ich leite diese Anfrage also auf https://discourse-domain.com/forum/t140842 um. In der Tabelle permalinks habe ich diesen Eintrag forum/t140842 hinzugefügt, indem ich den bereits vorhandenen Permalink mit der vollständigen slugifizierten URL mithilfe einer Regex verwendet habe (siehe oben).

Hoffentlich hilft dies jemand anderem als Ausgangspunkt.

1 „Gefällt mir“