带有regexp的Nginx变量

带有regexp的Nginx变量,nginx,configuration,Nginx,Configuration,我已经为大约40多个节点的服务器配置了nginx,所有这些都是这样写的: location /39/api { proxy_pass http://172.31.32.233:3138; } location /io39 { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; pro

我已经为大约40多个节点的服务器配置了nginx,所有这些都是这样写的:

location /39/api {
    proxy_pass http://172.31.32.233:3138;
}

location /io39 {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://172.31.32.233:3138;
}

location /40/api {
    proxy_pass http://172.31.32.233:3139;
}

location /io40 {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://172.31.32.233:3139;
}
正如您可以看到的那样,目标节点端口随着ID进入/io39和/39/api路径而增加,我知道我可以使用regexp在location指令中捕获数字,但是如何将变量增加为整数,并将其用作代理的目标端口,以便为数千个端口编写唯一的指令

谢谢

尽管在5.5之前的Perl和PHP中有一个regex修饰符,但据我所知,nginx没有任何等价物,也不可能有regex数学。答案中描述的可能技术之一。例如,您可以通过这种方式添加类似于
30000
的内容(我使用最长的4位正则表达式模式作为第一个,因为正则表达式匹配位置是从第一个到最后一个进行检查的):

location~“^/(\d{4})/api”{
设置$port 3$1;
代理通行证http://172.31.32.233:$port;
}
位置~“^/io(\d{4})”{
设置$port 3$1;
代理设置头升级$http\U升级;
代理设置头连接“升级”;
proxy_http_版本1.1;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://172.31.32.233:$port;
}
位置~“^/(\d{3})/api”{
设置$port 30$1;
代理通行证http://172.31.32.233:$port;
}
位置~“^/io(\d{3})”{
设置$port 30$1;
代理设置头升级$http\U升级;
代理设置头连接“升级”;
proxy_http_版本1.1;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://172.31.32.233:$port;
}
位置~“^/(\d{2})/api”{
设置$port 300$1;
代理通行证http://172.31.32.233:$port;
}
位置~“^/io(\d{2})”{
设置$port 300$1;
代理设置头升级$http\U升级;
代理设置头连接“升级”;
proxy_http_版本1.1;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://172.31.32.233:$port;
}
位置~“^/(\d)/api”{
设置$port 3000$1;
代理通行证http://172.31.32.233:$port;
}
位置~“^/io(\d)”{
设置$port 3000$1;
代理设置头升级$http\U升级;
代理设置头连接“升级”;
proxy_http_版本1.1;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://172.31.32.233:$port;
}
这将为
/1/api
/io1
提供端口号30001(以及
/01/api
/io01
),为
/2/api
/io2
提供端口号30002,
/9999/api
/io9999
URI提供高达39999的端口号

另一种方法是使用或:

location~“^/(?\d{1,4})/api”{
设置块$port{return ngx.var.number+3099}
代理通行证http://172.31.32.233:$port;
}
位置~“^/io(?\d{1,4})”{
设置块$port{return ngx.var.number+3099}
代理设置头升级$http\U升级;
代理设置头连接“升级”;
proxy_http_版本1.1;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$Host;
代理通行证http://172.31.32.233:$port;
}

非常有用,我发现第一种方法是可行的解决方案。谢谢