Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有可选参数的Regex多个URL,有些是反向引用所必需的,有些不是_Regex_Nginx - Fatal编程技术网

带有可选参数的Regex多个URL,有些是反向引用所必需的,有些不是

带有可选参数的Regex多个URL,有些是反向引用所必需的,有些不是,regex,nginx,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/ i、 e.过度简化可以说/old/(.*)重定向到/new/$

我有一组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/
i、 e.过度简化可以说
/old/(.*)
重定向到
/new/$1
,除非url的最后一部分是
/[0-9]+/expired/
,在这种情况下,它只是上升了一个级别。(除了我真的需要用
foo
bar
expired
1234
与URL匹配的部分来保持它更具体)

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

因此,到目前为止,我在
Nginx.conf
中的正则表达式类似于:

location ~* ^/old/(([0-9]+/)expired/)?|([0-9]+/(foo|bar/)?)?$ {
    return 301 /new/$1;
}
显然这是不对的。总之:

  • 如果url以
    /expired/
    结尾,我只想得到
    /[0-9]+/
    部分
  • 以及整个
    /[0-9]+/foo/
    /[0-9]+/bar/
    部分(如果以foo或bar结尾)
  • 只有
    /[0-9]+/
    部分,如果这就是它的结尾
  • 如果它只是以
    /old/
    结尾,那么只需重定向到
    /new/

只要斜杠没有问题,下面的正则表达式就可以与PCRE一起使用

 ^/old/([0-9]+/.*?)?(?:expired/)?$
  • ^/old/
    ->匹配从开始到结束的所有内容
  • ([0-9]+/.*?)
    ->可选地匹配数字/和后面的任何文本。显然,匹配的不仅仅是foo和bar
  • (?:expired/)?$
    ->(可选)匹配expired,在上一步中,引擎将继续逐字符检查延迟,然后如果已过期且字符串结尾是下一个,则将从捕获组中删除expired
使用/new/$1的结果:

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

看起来很有效,谢谢!我正在测试它,我可能会尝试将
*?
更改为
(foo | bar)?
以查看是否可以使它更具体。是的,这很有效,我必须像`^/old/([0-9]+/(foo/| bar/)?(?:expired/)那样做$`