Alte Forum-URLs mithilfe von Permalinks auf neue Discourse-URLs umleiten

<div data-theme-toc="true"> </div>

## Alte Forum-URLs mit Permalink auf neue Discourse-URLs umleiten

Wenn Sie mit [einem unserer Importskripte](https://github.com/discourse/discourse/tree/main/script/import_scripts) von anderer Forensoftware zu Discourse gewechselt sind, möchten Sie wahrscheinlich, dass alle Ihre hart erarbeiteten Google-Suchergebnisse weiterhin auf denselben Inhalt verweisen. Discourse verfügt über eine integrierte Möglichkeit, dies für Sie als Alternative zur Erstellung von nginx-Regeln zu behandeln, und zwar mithilfe der **Permalink-Lookup-Tabelle**.

Die Permalink-Tabelle ermöglicht es Ihnen, zwei Dinge festzulegen: eine abzugleichende URL und was diese URL anzeigen soll. Es gibt einige Optionen, um zu definieren, wohin die URL umgeleitet werden soll. Legen Sie eine dieser Optionen fest:

* **topic_id**: um ein Thema anzuzeigen
* **post_id**: um einen bestimmten Beitrag in einem Thema 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 die Themen-URLs Ihres ursprünglichen Forums 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-Antwortstatuscode 301](http://en.wikipedia.org/wiki/HTTP_301) (dauerhaft verschoben) zur korrekten URL für die Themen-ID 12345 durch. Der 301-Code sollte dazu führen, dass Suchmaschinen ihre Einträge aktualisieren und beginnen, die neuen URLs zu verwenden.

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’)


## Zusätzliche Informationen
Um die ID einer Unterkategorie zu finden, können Sie diese anhand des Slugs nachschlagen, indem Sie dies tun:

Category.find_by_slug(‘products’).id


Um den Permalink für diese URL zu löschen, tun Sie dies:

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

[quote="Dan Dascalescu, post:21, topic:20930, username:dandv"]
Ich habe gerade automatisch eine Themenzuordnung von MyBB zu Discourse mit dem Migrationsskript erstellt.

MyBB war so eingestellt, dass SEO-freundliche URLs ohne IDs verwendet wurden. Jetzt leitet nginx mich zum Beispiel um, wenn ich zu `/thread-foo-bar` navigiere, zu `/t/foo-bar/12`. So habe ich es gemacht:

1. Patchen Sie den Importer so, dass er Zeilen ausgibt, die eine [Map-Datei](https://gist.github.com/dandv/f6476574118d079b9063) erstellen, die für das [map-Modul](http://serverfault.com/questions/441235/maintaining-redirects-in-nginx-from-an-external-source/441517#441517) von nginx verwendet werden kann. Für den MyBB-Importer habe ich diesen Code in [`create_posts`](https://github.com/discourse/discourse/blob/9171125954620a5a1b9da128e5a82af22dad916e/script/import_scripts/mybb.rb#L130) hinzugefügt:

parent = topic_lookup_from_imported_post_id(m[‘first_post_id’])
if parent
puts “\nXXX #{m[‘topic_id’]}: #{parent[:topic_id]},”
end


Danach habe ich nach Zeilen gesucht, die mit XXX beginnen, das `XXX` entfernt und die Datei in ein JSON-Objekt umgewandelt, das ich in [dieses Skript](https://github.com/dandv/discourse-post-process/blob/master/redirects.js) eingefügt habe. Ändern Sie die URLs in Ihre Foren, führen Sie das Skript aus, und dessen Ausgabe wird eine Reihe von nginx-Map-Zeilen sein. Ich habe sie als `/etc/nginx/mybb2discourse.map` gespeichert.
2. [Konfigurieren Sie nginx so, dass es „andere Websites auf demselben Computer wie Discourse ausführt“](/t/running-other-websites-on-the-same-machine-as-discourse/17247), während Sie die folgenden Änderungen an der nginx-Konfigurationsdatei (`/etc/nginx/conf.d/discourse.conf`) vornehmen, um nginx auf die Map-Datei zu verweisen:
  * Fügen Sie dies oben in die Datei ein:

map_hash_bucket_size 128;
map_hash_max_size 50000; # muss möglicherweise erhöht werden

map $uri $new {
include /etc/nginx/mybb2discourse.map;
}


  * Fügen Sie dann im Abschnitt `server` hinzu:

if ($new) {
rewrite ^ $new permanent;
}


3. Schließen Sie die nginx-Neulade- und Container-Neuerstellungsschritte vom Ende des oben verlinkten Beitrags *Configure nginx…* ab.

Es wäre toll, wenn jemand, der sich besser mit Ruby auskennt, [den Importer](https://github.com/discourse/discourse/blob/master/script/import_scripts/mybb.rb) so patchen würde, dass er die Themen-ID-Map (oder noch besser, die nginx-Map direkt) ausgibt.
[/quote]

### Discourse zu WordPress-Weiterleitungsfragen
https://meta.discourse.org/t/discourse-to-wordpress-redirect-questions/87031

### Permalink-Normalisierung

[quote="Danny Goodall, post:36, topic:20930, username:bletch"]
Ich wollte hier noch einmal auf ein paar Fallstricke zurückkommen, auf die ich gestoßen bin, und vielleicht ein paar Wegweiser für zukünftige Reisende hinterlassen – denn ich fand dies höllisch schwer zu debuggen.

**Escaping im Permalink-Normalisierungsstring**
Das Format des Permalink-Normalisierungsstrings hat zwei Komponenten

1. der **Regulärer Ausdruck**-String
2. der **Ersatz**-String

Sie erscheinen unmittelbar nacheinander im Permalink-Normalisierungsstring, wie folgt:

     Permalink Normalization
Regular Expression       Replacement

<-------------------------><------------->
/(this)reallyis(intuitive)/\1reallyisn’t\2


Wichtig ist, dass Schrägstriche in den verschiedenen Teilen desselben Strings unterschiedlich behandelt werden.

Ein Schrägstrich (und andere Regex-Zeichen) im Teil **Regulärer Ausdruck** des Strings **muss** escaped werden, während Schrägstriche im Teil **Ersatz** desselben Strings nicht escaped werden müssen und stattdessen wörtlich behandelt werden.

**Das Format der eingehenden URL-Strings**

Zweitens, und das habe ich eine Weile gebraucht, um es herauszufinden, gleichen Sie die URL als relativen Pfad vom Root ab, aber Sie erhalten den `/` nicht als ersten Teil des Strings.

Wenn die URL, die Ihr altes Forum verwendet hat, zum Beispiel so aussah…

`http://oldforum.com/chat/the-topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1`

…dann sieht die URL, gegen die der reguläre Ausdruck in Ihrer Permalink-Normalisierung abgleicht, so aus…

`chat/topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1`

d.h. eine Pfadbeschreibung vom Root, aber ohne den führenden `/` Schrägstrich. (Ich *vermute*, dass dies je nach Struktur der URLs, die Sie umleiten, variieren kann – aber ich glaube es nicht).

**Beispiele**

Hier sind einige Beispiele aus meinem Migrationsprojekt

CATEGORY_LINK_NORMALIZATION = ‘/(cat)\/(.?)([#\?].)?$/cat/\2’
POST_LINK_NORMALIZATION = ‘/chat\/(.?)\/(post)\/(.+?)([#\?].)?$/post/\3’
TOPIC_LINK_NORMALIZATION = ‘/(chat)\/(.?)([#\?].)?$/topic/\2’


**Der Prozess**

| Alte URL | Permalink-Normalisierung | URL-Abgleichtext |
| --- | --- | --- |
| http://oldsite.com/cat/history | `/(cat)\\/(.*?)([#\\?].*)?$/cat/\\2` | `cat/history` |
| [http://oldsite.com/chat/topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1 ](http://oldsite.com/chat/topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1) | `/chat\\/(.*?)\\/(post)\\/(.+?)([#\\?].*)?$/post/\\3` | `post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1` |
| [http://oldsite.com/chat/mindgames-in-football ](http://oldsite.com/chat/mindgames-in-football) | `/(chat)\\/(.*?)([#\\?].*)?$/topic/\\2` | `topic/mindgames-in-football` |

Die **Alte URL** ist wie der Name schon sagt – die URL des Elements im alten System.

Die **Permalink-Normalisierung** (gespeichert in der Systemeinstellung `permalink_normalizations`) erfasst die eingehende URL (ohne den führenden Schrägstrich /) und wendet den Regex-Abgleich an. Die resultierende normalisierte URL wird dann verwendet, um mit dem auf dem Bildschirm `/admin/config/permalinks` eingegebenen **URL-Abgleichtext** abgeglichen zu werden.
[/quote]

---
*Zuletzt überprüft von @SaraDev am [date=2022-06-03 time=13:00:00 timezone="America/Los_Angeles"]*
37 „Gefällt mir“