これを振り返って、見つけたいくつかの注意点に言及し、将来の旅行者のためにいくつかの手がかりを残しておきたいと思いました。デバッグが非常に困難だったからです。
パーマリンク正規化文字列のエスケープ
パーマリンク正規化文字列の形式には2つのコンポーネントがあります。
- 正規表現文字列
- 置換文字列
これらは、パーマリンク正規化文字列内で、次のように互いにすぐ隣り合って表示されます。
Permalink Normalization
Regular Expression Replacement
<-------------------------><-------------
/(this)reallyis(intuitive)/\\1reallyisn't\\2
重要なのは、スラッシュは同じ文字列の異なる部分で異なるように扱われることです。
正規表現部分の文字列のスラッシュ(およびその他の正規表現文字)はエスケープする必要があります。ただし、置換部分の文字列のスラッシュはエスケープする必要はなく、リテラルとして扱われます。
受信URL文字列の形式
第二に、これは私が理解するのにしばらく時間がかかりましたが、URLはルートからの相対パス記述として一致しますが、文字列の最初の部分として「/」は受け取りません。
たとえば、古いフォーラムのURLが次のようになっている場合…
http://oldforum.com/chat/the-topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1
…正規表現が一致するパーマリンク正規化のURLは次のようになります…
chat/topic-title/post/d9aa09c3-19bd-4c6e-9d8d-a8f1008000a1
つまり、ルートからのパス記述ですが、先頭の「/」スラッシュはありません。(リダイレクトするURLの構造によってはYMMVかもしれませんが、そうは思いません)。
例
私の移行プロジェクトからの例をいくつか示します。
CATEGORY_LINK_NORMALIZATION = '/(cat)\\/(.*?)([#\\?].*)?$/cat/\\2'
POST_LINK_NORMALIZATION = '/chat\\/(.*?)\\/(post)\\/(.+?)([#\\?].*)?$/post/\\3'
TOPIC_LINK_NORMALIZATION = '/(chat)\\/(.*?)([#\\?].*)?$/topic/\\2'
プロセス
古いURLは、その名の通り、古いシステムのアイテムのURLです。
パーマリンク正規化(permalink_normalizationsシステム設定に記録)は、受信URL(先頭のスラッシュ/なし)を取得し、正規表現マッチを適用します。結果として正規化されたURLは、/admin/customize/permalinks画面に入力されたURL一致テキストと一致するために使用されます。