带有可选参数的正则表达式多个URL,一些是反向引用所必需的,一些不是

时间:2015-07-30 14:21:39

标签: regex nginx

我有一组URL正在进行301重定向(使用Nginx,我认为它使用PCRE作为其Regex引擎)。这是所需内容的简化版本:

  • /old/
    • 重定向到/new/
  • /old/1234/
    • 重定向到/new/1234/
  • /old/1234/foo/
    • 重定向到/new/1234/foo/
  • /old/1234/bar/
    • 重定向到/new/1234/bar/
  • /old/1234/expired/
    • 重定向到/new/1234/

即。过度简化可以说/old/(.*)重定向到/new/$1,除了网址的最后一部分是/[0-9]+/expired/,在这种情况下,它只是上升到一个级别。 (除了我真的需要使用与网址匹配的foobar expired1234部分更具体。

如果可能的话,我想在一个正则表达式中涵盖所有这些内容,而不是针对每个变体都有多个规则。

所以到目前为止Nginx.conf中的正则表达式是这样的:

location ~* ^/old/(([0-9]+/)expired/)?|([0-9]+/(foo|bar/)?)?$ {
    return 301 /new/$1;
}

显然这不对。总结:

  • 如果网址以/[0-9]+/结尾,我想获得/expired/部分。
  • 整个/[0-9]+/foo//[0-9]+/bar/部分,如果它以foo或bar结尾。
  • 只有/[0-9]+/部分,如果它就是它的结尾。
  • 如果它只是以/old/结尾,则只需重定向到/new/

1 个答案:

答案 0 :(得分:4)

只要斜杠没问题,下面的正则表达式就适用于PCRE。

 ^/old/([0-9]+/.*?)?(?:expired/)?$
  • ^/old/ - >从一开始就匹配一切到/旧
  • ([0-9]+/.*?)? - >可选择在LAZILY之后匹配数字/和任何文本。显然,匹配不仅仅是foo和bar。
  • (?:expired/)?$ - >可选地匹配已过期,在上一步中延迟,引擎将继续按字符检查char,然后如果它已过期且字符串的结尾是下一个,则将从捕获组中删除过期。

结果使用/ new / $ 1:

/new/
/new/1234/
/new/1234/foo/
/new/1234/bar/
/new/1234/