【问题标题】:Dynamic proxy_pass based on location基于位置的动态 proxy_pass
【发布时间】:2020-11-03 19:16:51
【问题描述】:

我正在尝试根据位置创建动态 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;

}

【问题讨论】:

    标签: nginx proxy


    【解决方案1】:

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

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

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

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

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

    请参阅this useful resource 了解正则表达式。

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2020-06-09
      • 2020-06-27
      • 2016-12-29
      相关资源
      最近更新 更多