首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有可选参数的Regex多个URL,有些是反向引用所需的,有些不是

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

Stack Overflow用户
提问于 2015-07-30 14:21:39
回答 1查看 6K关注 0票数 2

我有一组我正在做的301重定向的URL(使用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/,在这种情况下,它只是上升了一个级别。(但我确实需要对foobar expired1234部件保持更具体的匹配URL)。

如果可能的话,我想用一个正则表达式来描述所有这些,而不是对每个变化都有多个规则。

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

代码语言:javascript
复制
location ~* ^/old/(([0-9]+/)expired/)?|([0-9]+/(foo|bar/)?)?$ {
    return 301 /new/$1;
}

显然这不对。总结如下:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 14:53:16

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

代码语言:javascript
复制
 ^/old/([0-9]+/.*?)?(?:expired/)?$
  • ^/old/ ->匹配从开始到/old的所有内容
  • ([0-9]+/.*?)? ->可以选择地匹配数字/和懒惰后的任何文本。显然,匹配的不仅仅是foo和酒吧。
  • (?:expired/)?$ ->可选地匹配过期,在前面的步骤中,引擎将继续逐字符检查char,如果它过期并且字符串的结尾为next,则过期将从捕获组中删除。

使用/新/1美元的结果:

代码语言:javascript
复制
/new/
/new/1234/
/new/1234/foo/
/new/1234/bar/
/new/1234/
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31726362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档