1

我真的很挣扎这个正则表达式。

我们正在推出新版本的“群组”功能,但需要支持同一 URL 中的所有旧群组。幸运的是,这两个功能具有不同的 url 模式,所以这应该很容易吗?对?

  • 旧:domain.com/group/$groupname
  • 新:domain.com/group/$groupid/$groupname

我在正则表达式中用于将旧组重定向到旧脚本的当前正则表达式是:RewriteRule ^(group/([^0-9/].*))$ /old_group.php/$1 [L,QSA]

在弹出一个名为domain.com/group/2009-neato-group的组之前,它一直运行良好

此时正则表达式匹配并强制新组使用旧代码,因为它包含数字。哎呀。

那么,关于匹配旧模式的正则表达式的任何想法,以便我可以重定向它?

它必须匹配的模式

  • 组/我的老组
  • 组/另一个旧组/
  • group/123-another-old-group-456/a-module-inside-the-group/

它无法匹配的模式

  • 组/12/一个新组
  • 组/345/另一个新组/
  • group/6789/a-3rd-group/module-abc/

我想到的最好方法是它不能以“group-slash-numbers-slash”开头,但无法将其转换为正则表达式。所以,否定这种模式的东西可能会起作用。

谢谢

4

2 回答 2

0

您的设计选择使纯 htaccess 解决方案变得困难,特别是因为group/123-another-old-group-456/a-module-inside-the-group/它是一个有效的旧式 URL。

我建议使用重定向器脚本来查看它的参数,确定第一部分是否有效groupid,如果是,那么它是一个将用户带到该组的新型 URL。否则,它是一个旧式 URL,所以把它交给old_group.php. 像这样的东西:

RewriteRule ^group/(.*)$ /redirector.php/$1 [L,QSA]
于 2009-07-18T00:08:51.690 回答
0

反过来想:如果 url 匹配 ^group/[0-9]+/.+,那么它是一个新组,所以首先重定向这些(使用 [L] 规则)。其他一切都必须是旧组,您可以将旧规则保留在那里。

于 2009-07-18T00:35:12.127 回答