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

dun*_*can 2 regex nginx

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

  • /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,除非 url 的最后一部分是/[0-9]+/expired/,在这种情况下它只会上升一个级别。(除非我真的需要使用foo,bar expired1234与 URL 匹配的部分使其更具体)。

如果可能,我想在一个正则表达式中涵盖所有这些,而不是为每个变体设置多个规则。

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

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

显然这是不对的。总之:

  • 我想只是/[0-9]+/如果URL结尾部分/expired/
  • 以及以 foo 或 bar 结尾的全部/[0-9]+/foo//[0-9]+/bar/部分。
  • /[0-9]+/如果这就是它的结尾,那只是一部分。
  • 如果它刚刚结束,/old/那么只需重定向到/new/

Dan*_*nez 5

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

 ^/old/([0-9]+/.*?)?(?:expired/)?$
Run Code Online (Sandbox Code Playgroud)
  • ^/old/ -> 匹配从开始到 /old 的所有内容
  • ([0-9]+/.*?)?-> 可选择匹配数字/和 LAZILY 之后的任何文本。显然,匹配的不仅仅是 foo 和 bar。
  • (?:expired/)?$ -> 可选匹配expired,与上一步中的lazy 引擎会继续逐个字符检查,然后如果它已过期并且字符串的结尾是下一个,则expired 将从捕获组中删除。

使用 /new/$1 的结果:

/new/
/new/1234/
/new/1234/foo/
/new/1234/bar/
/new/1234/
Run Code Online (Sandbox Code Playgroud)