我有一组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/
,在这种情况下,它只是上升到一个级别。 (除了我真的需要使用与网址匹配的foo
,bar
expired
和1234
部分更具体。
如果可能的话,我想在一个正则表达式中涵盖所有这些内容,而不是针对每个变体都有多个规则。
所以到目前为止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/
答案 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/