基于位置的动态代理传递



我正在尝试基于位置创建动态proxy_pass(将在docker中运行,并根据堆栈名称将流量重定向到托管http的docker堆栈(

这是我当前的配置。我已经到了使用静态位置进行重定向的地步(底部用蓝色/绿色重定向注释的变体正确,应用程序运行良好(。我遇到了动态位置(~^/(?<ver>.*)/(?<rest>.*)?$)的问题——目标URL的正确粘贴有问题。当我转到https://myapp.com/blue/时,nginx记录了dns解析blue could not be resolved (3: Host not found)的问题,看起来它在http://${ver}_${subdomain}/$rest中剪切了$<ver>之后的所有内容。我不是REGEX专家,我可能把location部分搞砸了,有什么建议吗?

server {
listen 80;
server_name ~^(?<subdomain>.+).(mydomain.com|mydomain.pl)$;
resolver 127.0.0.11 ipv6=off;
location ~^/(?<ver>.*)/(?<rest>.*)?$ {                            
set $target http://${ver}_${subdomain}/$rest;
proxy_pass $target;     
proxy_set_header Host $host;                                
proxy_set_header X-Real-IP $remote_addr;                    
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} 
# location ~ ^/blue/((?<rest>.*))?$ {
#         set $exdomain http://blue_$subdomain/$rest;
#         proxy_pass $exdomain;
#         proxy_set_header Host $host;
#         proxy_set_header X-Real-IP $remote_addr;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
# location ~ ^/green/((?<rest>.*))?$ {
#         set $exdomain http://green_$subdomain/$rest;
#         proxy_pass $exdomain;
#         proxy_set_header Host $host;
#         proxy_set_header X-Real-IP $remote_addr;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# }
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
send_timeout 90;
}

正则表达式中的*是贪婪的,因此$ver将捕获所有内容,直到最后一个/,而不是您想要的下一个/

一种解决方案是使用非贪婪变体*?(不要与?混淆(,例如:

location ~ ^/(?<ver>.*?)/(?<rest>.*)?$ { ... }

但更好的解决方案是使用不包括/的字符类,例如:

location ~ ^/(?<ver>[^/]+)/(?<rest>.*)?$ { ... }

请参阅此有关正则表达式的有用资源。

最新更新