带有可选参数的Regex多个URL,有些是反向引用所必需的,有些不是
我有一组URL,我正在为其执行301重定向(使用Nginx,我认为它的Regex引擎使用PCRE)。这是所需内容的简化版本:带有可选参数的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/$
/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
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/
部分(如果以foo或bar结尾)/[0-9]+/bar/
- 只有
部分,如果这就是它的结尾/[0-9]+/
- 如果它只是以
结尾,那么只需重定向到/old/
/new/
^/old/([0-9]+/.*?)?(?:expired/)?$
->匹配从开始到结束的所有内容^/old/
->可选地匹配数字/和后面的任何文本。显然,匹配的不仅仅是foo和bar([0-9]+/.*?)
->(可选)匹配expired,在上一步中,引擎将继续逐字符检查延迟,然后如果已过期且字符串结尾是下一个,则将从捕获组中删除expired(?:expired/)?$
/new/
/new/1234/
/new/1234/foo/
/new/1234/bar/
/new/1234/
看起来很有效,谢谢!我正在测试它,我可能会尝试将
*?
更改为(foo | bar)?
以查看是否可以使它更具体。是的,这很有效,我必须像`^/old/([0-9]+/(foo/| bar/)?(?:expired/)那样做$`