【问题标题】:nginx regex - match variable number of fieldsnginx 正则表达式 - 匹配可变数量的字段
【发布时间】:2015-10-05 15:11:56
【问题描述】:

我有一个带有可选额外字段的 url 路由。它可以是以下任何一种形式:

  • "/my-route/azezaezaeazeaze.123x456.jpg"
  • "/my-route/azezaezaeazeaze.123x456.6786786786.jpg"

与:

  • “azezaezaeazeaze”是一个 mongoId
  • 123x456 两个用“x”隔开的整数
  • 6786786786 一个 unix 时间戳
  • jpg 图像扩展名(可以是 jpeg、png、gif...)
  • 所有这些都用“.”分隔

我想使用http rewrite 模块从请求中删除可选部分(时间戳)。这样第二个 url 就变成了第一个。

我在regex101 上做了一个小测试来获取组,但是: - 它似乎不是 nginx 的正确语法 - 我看不出它如何让我删除时间戳

如何从该网址中删除时间戳?

【问题讨论】:

    标签: regex nginx


    【解决方案1】:

    从右端开始,你需要匹配一个点,然后是任何东西 除了一个点,所以我们有(\.[^.]*)$,然后向左移动,我们想要 匹配一个点后面只有数字\.[0-9]*,我们不想这样 捕获,然后到左边我们想要的一切。 我最终得到了这样的结果:

    rewrite ^(.*)\.[0-9]*(\.[^.]*)$ $1$2 ;
    

    【讨论】:

    • 所以它与 url 匹配,但它没有正确重写它。我正在尝试找出问题所在。
    • 抱歉,\1\2 是您的 regex101 示例中的替换语法。对于 nginx,它应该是 $1$2。至于标志,这取决于您的其余设置。
    • 啊,看来你是对的,我接受了你的回答。你会说你的正则表达式比我的更有效吗(因为它似乎对数字更严格)?
    • 它并不是特别有效,因为.* 匹配太多并导致回溯直到.[0-9] 匹配。您可以尝试使用多个 \.[^.]* 的版本,因为它们会在不回溯的情况下进行。
    【解决方案2】:

    利用我的第一次尝试和@meuh 的回答,我得到了以下结果:

    rewrite ^(/.*\..*)(\..*)(\..*)$ $1$3 last;
    

    现在它可以工作了,但我欢迎任何关于这种重写的风格/效率的评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2016-03-25
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2011-11-16
      相关资源
      最近更新 更多