Хотел вернуться к этой теме, чтобы упомянуть несколько подводных камней, с которыми я столкнулся, и, возможно, оставить следы для будущих путешественников, поскольку отладка этого была для меня адски сложной.
Экранирование в строке нормализации постоянных ссылок
Формат строки нормализации постоянных ссылок состоит из двух компонентов:
- Строка регулярного выражения
- Строка замены
Они появляются одна за другой в строке нормализации постоянных ссылок следующим образом:
Нормализация постоянных ссылок
Регулярное выражение Замена
<-------------------------><------------->
/(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, которые вы перенаправляете, но я так не думаю).
Примеры
Вот несколько примеров из моего проекта миграции:
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-адрес затем используется для сопоставления с текстом совпадения URL, введенным на экране /admin/customize/permalinks.