【问题标题】:Regex to match a URL pattern for a htaccess file正则表达式匹配 htaccess 文件的 URL 模式
【发布时间】:2010-11-11 21:13:48
【问题描述】:

我真的很纠结这个正则表达式。

我们正在推出新版本的“群组”功能,但需要支持同一 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/

无法匹配的模式

  • group/12/a-new-group
  • group/345/another-new-group/
  • group/6789/a-3rd-group/module-abc/

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

谢谢

【问题讨论】:

    标签: regex .htaccess url-rewriting friendly-url


    【解决方案1】:

    您的设计选择使纯 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]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是我正在考虑的一种方法,但与我在代码中的其他规则相比,相反的方法似乎更清晰。但是,我最终可能不得不屈服。谢谢。
      • 如果你想否定模式,只需在前面加上“!”像这样:!^group/[0-9]+/.+
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多