Probleme mit Permalink-Weiterleitungen, da der Fragment-Teil nach „#" nicht an den Server gesendet wird

BESARBEITUNG: Titel des Themas geändert, um das Problem widerzuspiegeln, das ich dank der Antworten unten entdeckt habe

Ich erlebe ein seltsames Verhalten bei Permalinks in meiner Migrationsarbeit.

Mein Problem ist nicht das, dass interne Links nicht weiterleiten. Ich teste dies einfach, indem ich URLs in die Adressleiste meines Browsers einfüge.

Das sind die beiden Weiterleitungen, die in meinen Tests stattfinden sollen:

das ist eine Beitrags-Weiterleitung, sollte zum zweiten Beitrag weiterleiten wie folgt:

das ist eine Themen-Weiterleitung, sollte gehen zu:

Ich weiß, dass meine Normalisierungen einwandfrei funktionieren. Meine Regex ist

/(?:.*)(\/)(?<topicid>\d*.)-(.[^\/#\?]*)(?<parm>\?(\w*)[=](?<start>\d+))?(?:\/)?(\D+(\/)?)?(?<postid>\d+)?(?:\/)?/normalized.\k<topicid>.\k<postid>

Und ich überprüfe sie in der rails-Konsole:

irb(main):069:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs#16249')
=> "normalized.17978.16249"

irb(main):068:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs')
=> "normalized.17978."

Das ist das, was ich beabsichtigt habe. Ich habe dies in meiner Permalinks-Tabelle:

Und so sieht es aus, wenn man die Datenbank betrachtet:

Aber wenn ich dies in die Browser-URL einfüge

wird es umgeleitet zu

Anstatt wie es sein sollte:

Also sehe ich den ersten Beitrag, er scrollt nicht zum zweiten, wie es sollte.

Warum wird dieser #16249-Hash wieder hinzugefügt, wenn meine Normalisierung ihn entfernt hat?

Eine andere Möglichkeit, diese Inkonsistenz aufzuzeigen (wenn auch etwas künstlich), ist, folgende Weiterleitungen aus der Adressleiste des Browsers zu versuchen:

https://community.suitecrm.com/normalized.17978.
wird korrekt weitergeleitet zu:
Reports disappeared - 💬 General Discussion - SuiteCRM

Und Why two Italian language packs? - #2 by roberto - Translation and Language Packs - SuiteCRM
wird korrekt weitergeleitet zu
Reports disappeared - #2 by erevodifosin - 💬 General Discussion - SuiteCRM

Warum funktioniert es also nicht, wenn man den normalen Prozess durchläuft?

Permalinks funktionieren nur für eingehende Links, das steht genau in der Beschreibung.

Sie müssen die internen Links korrigieren.

Wie ich am Anfang meines Beitrags erwähnt habe, ist dies nicht der Fall; ich klicke nicht auf Links in meinen eigenen Foren.

Aber vielleicht verstehe ich nicht, was hier mit „internen Links

Der URL-Fragment-Identifikator (das # und alles danach) wird vom Browser niemals an den Server gesendet – Sie können ihn nicht als Teil einer Weiterleitung verwenden.

Wenn du das sagst, ergibt das Sinn … aber es ist ziemlich deprimierend.

Ich schätze, das schließt ordentliche Weiterleitungen auf Post-Ebene von meinen alten Foren komplett aus, da sie dafür # verwenden :sob:

Ist dies eine häufige Einschränkung, der sich Leute bei Migrationen gegenübersehen? Das ist doch Kunena-Software, das ist wohl ziemlich üblich, und ich wette, andere nutzen auch Hashes, um auf Posts zu verlinken…

Ich habe das in meinem Kopf immer wieder durchgespielt. Es ist so eine nervige Einschränkung. Ich vermute, der grundlegende Fehler wurde schon vor langer Zeit von den Kunena-Forum-Designern gemacht, als sie nur Fragmente zur Kennzeichnung von Beitrags-Links verwendeten… sigh.

Ich sehe drei Ansätze, die Discourse nutzen könnte, um dies zu umgehen (ich befinde mich hier eindeutig im Bereich des Wunschdenkens, genießt die Fahrt):

  1. JavaScript greift beim Laden der Seite ein, erkennt, dass ein Hash-Fragment in der URI vorhanden ist, und ruft den Server auf, um eine korrekte Weiterleitung durchzuführen. Das funktioniert, aber es kommt zu einer doppelten Weiterleitung, und der Benutzer sieht, wie die Seite neu geladen wird.

  2. Discourse könnte serverseitig ein id-Tag mit der alten importierten post_id zu jedem Beitrag im HTML hinzufügen. Auf diese Weise würde der Browser die alte Hash-ID übertragen und sie auf der weitergeleiteten Seite verwenden, um zum Ende zu scrollen. Hauptproblem: Discourses ausgeklügeltes Scrollen, bei dem Beiträge erst geladen werden, wenn man zu ihnen scrollt, macht dieses Schema unzureichend.

  3. Eine Mischung aus beiden: Discourse erstellt serverseitig eine Tabelle mit der Zuordnung zwischen alten importierten post_ids und neuen post_numbers und sendet diese beim Laden der Seite an den Client. JavaScript auf dem Client erkennt, dass ein Hash in der URI vorhanden ist, übersetzt diesen Hash mithilfe der Tabelle und verwendet seine eigenen Scroll-Funktionen, um zum richtigen Beitrag zu gelangen.

Dies wäre aufwendig zu implementieren und hätte eine Leistungseinbuße zur Folge. Es würde jedoch perfekte Migrationen ermöglichen…

Das sind keine vollständigen Lösungen, da Umleitungen nur funktionieren, wenn der Benutzer sich bereits in Discourse befindet. Externe Links erreichen das auf diese Weise viel seltener.

Mein aktueller Ansatz für interne/externe Weiterleitungen ist folgender:

Meine alte Seite befindet sich unter
https://suitecrm.com/suitecrm/forum/, die neue unter
https://community.suitecrm.com/

Wenn der migrierte Server live geht, führen wir eine Gateway-Weiterleitung von der alten zur neuen Seite durch.

Ich lasse meine internen Links unverändert, beginnend mit https://suitecrm.com/suitecrm/forum/. Wenn jemand darauf klickt, ist das praktisch gesehen eine externe Anfrage. Anschließend erfolgt unsere Gateway-Weiterleitung, und die Anfrage gelangt zurück zu Discourse, wo die Permalinks dann ganz normal greifen sollten.

Richtig? Ich habe das noch nicht ausprobiert… Ich vermute, das wäre unmöglich, wenn wir denselben Domainnamen und denselben Ordner verwenden wollten, was wir aber nicht tun.

Was Sie tun müssen, ist Permalink-Weiterleitungen verwenden.

Ich erstelle häufig Permalinks wie /oldpost/POST_ID und schreibe dann eine Permalink-Weiterleitung, um /forum./category/someslug#1234 so umzuschreiben, dass diese Links verwendet werden.

Meinst du mit „Permalink-Umleitung

Hoppla! Ja, sorry. Mein Gehirn war schon zu spät dran.

Ok :slight_smile:

Aber ich verwende Permalink-Normalisierungen (siehe meinen ersten Beitrag). Nur der Hash-Teil wird nie an den Server gesendet. Es sei denn, es gibt etwas Client-seitiges JavaScript, das seine Magie entfaltet, wird ein Forum, das ausschließlich Hashes für Links auf Beitrags-Ebene verwendet, niemals korrekt zu Discourse (oder zu jeder anderen Software) migriert werden können (hinsichtlich der Weiterleitungen).

Entschuldigung. Ich habe das nicht sorgfältig genug gelesen. Ich dachte, ich hätte zuvor Inhalte nach dem Hash verwendet, aber das scheint falsch zu sein. Ich erinnere mich an einen kürzlichen Fall, in dem diese Hash-Beitrags-IDs vorhanden waren, aber anscheinend wollte der Client nur Umleitungen auf Themen-Ebene. Ich denke, dass bei 301-Umleitungen das Erreichen des richtigen Themas wahrscheinlich ausreicht.