覆盖Nginx参数中的参数

时间:2019-11-21 14:08:30

标签: nginx

对于路径/{any string with one or more char}/foo,我需要覆盖参数id。它可能在那里,可能没有。我想保留其他参数。

示例:

  1. /a/foo-> /a/foo?id=$id
  2. /bar/foo?id=99-> /bar/foo?id=$id
  3. /123/foo?id-> /123/foo?id=$id
  4. /bar/foo?id=99&id2=100-> /bar/foo?id=$id&id2=100

我尝试过的事情:

  location ~* ^/.+/foo/*$ {
    if ($args ~ (.*)(id.*)(.*)) {
      return 302 $uri?$1$3;
    }

    set $url $uri?${args}&id=$id;
    return 302 $url; 
  }

但是,该参数没有被替换。

1 个答案:

答案 0 :(得分:0)

您的if块将无法正确提取前导参数和尾随参数,因为您需要标识&分隔符。

尝试:

location ~* ^/.+/foo/?$ {
    if ($args ~ ^(.*&)?id[^&]*(&.*)?$) {
        return 302 $uri?$1id=$id$2;
    }
    return 302 $uri?id=$id$args; 
}