Alte Forum-URLs mit Permalinks auf neue Discourse-URLs umleiten

Alte Foren-URLs mit permalinks auf neue Discourse-URLs umleiten

Wenn Sie mit einem unserer Import-Skripte von anderer Forensoftware auf Discourse umgestiegen sind, möchten Sie wahrscheinlich, dass alle Ihre hart erarbeiteten Google-Suchergebnisse weiterhin auf denselben Inhalt verweisen. Discourse verfügt über eine integrierte Methode, um dies für Sie zu behandeln, als Alternative zum Schreiben von nginx-Regeln, mithilfe der Permalink-Nachschlagetabelle (permalinks lookup table).

Die Permalink-Tabelle ermöglicht es Ihnen, zwei Dinge festzulegen: eine abzugleichende URL und wohin diese URL umleiten soll. Es gibt einige Optionen für die Definition des Weiterleitungsziels. Legen Sie eine dieser Optionen fest:

  • topic_id: um ein Thema anzuzeigen
  • post_id: um einen bestimmten Beitrag innerhalb eines Themas anzuzeigen
  • category_id: um eine Kategorie anzuzeigen
  • tag_id: um ein Tag anzuzeigen
  • user_id: um ein Benutzerprofil anzuzeigen
  • external_url: um zu einer URL umzuleiten, die möglicherweise nicht zu Ihrer Discourse-Instanz gehört

Wenn beispielsweise Ihre ursprünglichen Foren-Themen-URLs wie http://example.com/discussion/12345 aussahen und die URL für dieses Thema nach dem Import http://example.com/t/we-moved/987 lautet, können Sie die Zuordnung wie folgt einrichten:

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

Discourse führt dann eine Weiterleitung mit HTTP-Antwortcode 301 (dauerhaft verschoben) zur korrekten URL für die Themen-ID 12345 durch. Der 301-Code sollte Suchmaschinen dazu veranlassen, ihre Aufzeichnungen zu aktualisieren und mit der Verwendung der neuen URLs zu beginnen.

Wenn Sie möchten, dass einige URLs von Discourse wegleiten, können Sie dies tun, indem Sie external_url festlegen:

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

Wichtiges Verhalten für externe Permalinks bei Themen-URLs

Wenn ein external_url-Permalink für eine Discourse-Themen-URL (z. B. /t/some-slug/123) erstellt wird, um auf eine externe Website umzuleiten, beachten Sie Folgendes:

  • das ursprüngliche Thema sollte soft-gelöscht (nicht hart gelöscht) sein
  • das Thema sollte zu einer öffentlichen Kategorie gehören

Grund: Wenn das Thema noch aktiv ist, wird es von Discourse normal aufgelöst und die Permalink-Suche wird nicht verwendet. Wenn sich das Thema in einer privaten Kategorie befindet, können Berechtigungsprüfungen 404 zurückgeben, bevor die externe Permalink-Weiterleitung angewendet wird.

Dies ist besonders relevant für die In-App-Navigation (angemeldete Benutzer), bei der Routen möglicherweise als JSON/XHR angefordert werden.

Zusätzliche Informationen

Um die ID einer Unterkategorie zu finden, können Sie diese anhand des Slugs wie folgt nachschlagen:

Category.find_by_slug('products').id

Um den Permalink für diese URL zu löschen, gehen Sie wie folgt vor:

Permalink.find_by_url("/blah").destroy

Es kann nur einen Permalink-Eintrag pro URL geben, suchen Sie also einfach nach URL.

Erstellen einer Themenzuordnung von MyBB zu Discourse

Fragen zur Weiterleitung von Discourse zu WordPress

Permalink-Normalisierung


Zuletzt überprüft von @SaraDev am 2022-06-03T20:00:00Z

37 „Gefällt mir“

Ist es möglich, die Rewrite-Regel direkt im Discourse Docker-Cluster zu speichern? Es gibt einen Webserver, der sich um HTTP und SSL kümmert. Kann ich dort etwas hinzufügen?

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

Ich sehe nicht, wie das funktionieren kann, da nginx die neuen Topic-IDs nicht kennt. Die /threads-IDs müssen in die Discourse-Topic-ID umgewandelt werden.

Wenn ich /threads/name.1234 aufrufe, wird es zu /t/name umgeschrieben und dann wird mir der richtige Beitrag angezeigt. Die ID wird in diesem Moment nicht verwendet, das habe ich gerade getestet.

Wahrscheinlich nur, wenn du Glück hast und Discourse und dein altes Forum die gleichen Slugs generieren (und der Slug nicht mit einer Zahl beginnt), aber das ist wahrscheinlich gut genug.

Wenn du NGINX wie vorgeschlagen ändern möchtest, kannst du dir die Webvorlage in discourse_docker ansehen, um zu erfahren, wie du die Nginx-Konfiguration innerhalb des Containers ändern kannst. Hier ist ein Beispiel:

1 „Gefällt mir“

Vielen Dank, ich denke, das wäre Ablenkung genug.

Muss ich diese Änderung bei jedem Update vornehmen?

Nein. Sie fügen dies zu Ihrer app.yml hinzu und es wird bei jedem Neuerstellen angewendet.

Um Zeit beim Testen zu sparen, könnten Sie:

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

Verwenden Sie dann vim oder nano, um zu bearbeiten, was auch immer Sie sehen möchten, um zu sehen, ob es das tut, was Sie denken (und sparen Sie 10-20 Minuten pro Neuerstellung). Sie können nginx mit sv restart nginx neu starten.

Nichts von dem oben Genannten wurde getestet, aber es sollte nahe dran sein.

1 „Gefällt mir“

Danke für die Hilfe, ich habe die Nginx-Konfiguration angepasst und sie funktioniert wie gewünscht.

1 „Gefällt mir“

Wo in der app.yml muss dies geschrieben werden, damit der nginx automatisch angepasst wird? Im Run-Bereich für die benutzerdefinierten Befehle?

weil (\u003cunknown\u003e): unbekannter Escape-Charakter beim Parsen eines zitierten Skalars gefunden, wenn ich das hinzufüge:

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

Schauen Sie sich Let’s Encrypt mit mehreren Domains/Weiterleitungen einrichten an und verwenden Sie dasselbe wie in diesem Beispiel, das zur Nginx-Konfiguration hinzugefügt wird.

Sie können es in den after_ssl-Hook (den Sie hinzufügen würden) einfügen, wie in diesem.

Ich bekomme immer noch den gleichen Fehler, ich glaube, es hat etwas mit meiner Formatierung zu tun.

1 „Gefällt mir“