只是想回到这个问题,提一下我发现的一些陷阱,也许可以为未来的旅行者留下一些线索——因为我发现调试起来非常困难。
永久链接规范化字符串中的转义
永久链接规范化字符串的格式包含两个部分
- 正则表达式字符串
- 替换字符串
它们在永久链接规范化字符串中紧挨着出现,如下所示:
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 的结构,你可能会有不同的结果——但我认为不会。)
示例
以下是我迁移项目中的一些示例
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 匹配文本进行匹配。