基于位置的动态proxy_pass

时间:2020-11-03 10:42:57

标签: nginx proxy

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

这是我当前的配置。我已经到了使用静态位置进行重定向的地步(在底部的注释变体中正确地使用了蓝色/绿色重定向,并且应用程序运行正常)。我在动态位置(~^/(?<ver>.*)/(?<rest>.*)?$)上遇到了问题-目标网址正确粘贴存在问题。当我转到https://myapp.com/blue/时,nginx日志以dns解析度blue could not be resolved (3: Host not found)发出,看起来它削减了$<ver>http://${ver}_${subdomain}/$rest之后的所有内容。我不是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;

}

1 个答案:

答案 0 :(得分:0)

正则表达式中的

*是贪婪的,因此$ver会捕获所有内容,直到 last /,而不是下一个/你打算的。

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

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

但是更好的解决方案是使用排除/的字符类,例如:

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

有关正则表达式,请参见this useful resource

相关问题