我正在将 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;
}