我遇到了一个相当奇怪的情况,我们的旧 URL 以 结尾.-detail
,需要更改为-detail
。
例如:
example.com/product.-detail
需要更改为example.com/product-detail
换句话说,.
需要去除。
我认为一个简单的 301 规则就可以解决问题,但我无法让条件字符串通过
RewriteRule ^$.-detail https://www.example.com/$1-detail [R=301,L]
请问正确的做法是什么?
答案1
RewriteRule ^$.-detail https://www.example.com/$1-detail [R=301,L]
正则表达式存在一些问题:
$
(字符串结尾锚点) 的位置错误。它应该位于正则表达式的末尾(您希望匹配URL.-detail
路径的末尾,即\.-detail$
)。- 没有捕获子模式,因此
$1
反向引用始终为空。 - 文字点应该用反斜杠转义,否则它会匹配任何字符并导致重定向循环(如果存在如上所述的捕获子模式) - 因为它还会匹配重定向的 URL,每次减少 1 个字符,直到 URL 中不再剩下任何内容!
这RewriteRule
图案(第一个参数)应该是这样的:
(.+)\.-detail$
^
由于正则表达式默认是贪婪的,并且点匹配“所有内容”,因此不需要(字符串起始锚点)。(尽管如果这样做更容易阅读,您也可以将其包括在内。)
然后反向$1
引用包含由括号内的子模式匹配的 URL 路径的部分(.+)
。
您可以捕获点之前和之后的两个部分,以避免在代换。 例如:
RewriteRule (.+)\.(-detail)$ https://www.example.com/$1$2 [R=301,L]
反向$2
引用仅包含-detail
从RewriteRule
图案。