从 nginx 位置路径获取值

从 nginx 位置路径获取值

我正在将 nginx 设置为 API 路由器。

如何获取“位置”路径的特定部分并将其动态填充到 proxy_pass 中?例如:

位置 /用户/v2/ { proxy_passhttp://app.domain.com/api/{{用户}}/v2; }

我需要抓取第一个字段中的任何内容(在本例中为“用户”),然后将其弹出到 proxy_pass 路径中。

答案1

我发现你原来的问题和你对答案的评论有点矛盾。但为了回答你对评论的要求,你可以使用location这样的块:

location ~ ^/(users)/v2/(.+)$ {
    proxy_pass http://app.domain.com/api/$1/v2/$2;
}

我假设路径在/v2/此之后还包含其他内容。我将其他内容捕获到$2以供在 中使用proxy_pass

如果希望只允许除用户之外的特定字符串,则可以使用|OR 匹配规则:

location ~ ^/(users|admins)/v2/(.+)$

nginx 中正则表达式捕获的通用规则是,任何括号内的正则表达式都会被捕获到一个变量中。第一个括号的内容会被捕获到,$1依此类推。

当然也有例外。(?:users)使得 nginx 无法捕获该值。(?<variable>users)将值捕获到名为的变量中$variable

答案2

如果你想在块内使用变量,情况会稍微复杂一些if()。以下方法行不通:

location ~ ^/(users)/v2/(.+)$ {
    if ( $http_user_agent ~ 'Googlebot' ) {
        # Does not work: $1 and $2 are undefined in this scope.
        proxy_pass http://app.domain.com/api/$1/v2/$2;
    }
}

但是,您可以保存这些值,然后在嵌套块中使用它们:

location ~ ^/(users)/v2/(.+)$ {
    set $base $1;
    set $resource $2;
    if ( $http_user_agent ~ 'Googlebot' ) {
        proxy_pass http://app.domain.com/api/$base/v2/$resource;
    }
}

答案3

不确定这是否会起作用,但它就像如果你只是想在/v2

location ~ ^/(.*)/v2/ {
    proxy_pass http://app.domain.com/api/$1/v2;
}

相关内容