Ich wollte nur noch einmal darauf zurückkommen, um ein paar der Stolpersteine zu erwähnen, die ich gefunden habe, und vielleicht ein paar Brotkrumen für zukünftige Reisende zu hinterlassen – denn ich fand es höllisch schwierig zu debuggen.
Escaping im Permalink-Normalisierungsstring
Das Format des Permalink-Normalisierungsstrings hat zwei Komponenten
- der Regulärer Ausdruck-String
- der Ersatz-String
Sie erscheinen nacheinander im Permalink-Normalisierungsstring, wie hier:
Permalink-Normalisierung
Regulärer Ausdruck Ersatz
<-------------------------><-------------
/(this)reallyis(intuitive)/\\1reallyisn't\\2
Wichtig ist, dass Slashes in den verschiedenen Teilen desselben Strings unterschiedlich behandelt werden.
Ein Slash (und andere Regex-Zeichen) im Regulärer Ausdruck-Teil des Strings muss escaped werden, jedoch müssen Slashes im Ersatz-Teil desselben Strings nicht escaped werden und werden stattdessen buchstäblich behandelt.
Das Format der eingehenden URL-Strings
Zweitens, und das hat eine Weile gedauert, bis ich es herausgefunden habe, passt man die URL als relativen Pfad vom Root an, aber man erhält nicht den / als ersten Teil des Strings.
Zum Beispiel, wenn die URL, die Ihr altes Forum verwendet hat, so aussah…
http://oldforum.com/chat/the-topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1
…dann wird die URL, gegen die der reguläre Ausdruck in Ihrer Permalink-Normalisierung abgeglichen wird, so aussehen…
chat/topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1
d. h. eine Pfadbeschreibung vom Root, aber ohne den führenden /-Slash. (Ich vermute, dass dies je nach Struktur der URLs, auf die Sie umleiten, variieren kann – aber ich glaube 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
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) greift die eingehende URL (ohne den führenden Slash /) auf und wendet den Regex-Match an. Die resultierende normalisierte URL wird dann verwendet, um mit dem URL-Match-Text auf dem Bildschirm /admin/customize/permalinks abgeglichen zu werden.