根据 URL 子路径反向代理到不同位置

Reserve proxy to different locations based on URL subpath

根据传递的参数,我有不同的服务来处理 URL 的不同部分

服务 offer 将处理路由 /offer/44 和其他路由,例如 /offer/44/calculator 以下代码成功处理了该路由。

 location ^~ /offer {
            location ^~ /offer {
                rewrite ^/offer/(.*)$ /offer/ break;
                proxy_pass http://localhost:4000/;
            }
        } 

但是当我有 url /offer/44/payments/* 并且应该通过另一个服务路由时,我的额外复杂层就来了

我尝试了很多不同的嵌套位置变体,但似乎对 payments 没有任何效果。尝试做类似下面的事情(重定向现在是基本的,因为我只是试图让它只是重定向......但理想情况下我希望它在 payment 之后接受所有内容并将其放入其他服务 URL)

    location ^~ /offer {
            location ^~ /offer {
                rewrite ^/offer/(.*)$ /offer/ break;
                proxy_pass http://localhost:4000/;
            }

            #my ideal /offer/44/payments/*
            location ^/offer/([0-9]+)/payment/(.*)$ {

                proxy_pass http://payment-docker.local:20000/init;
            } 
        } 

所以我的问题是:我如何使本地嵌套工作,以便如果它在 offer 之后看到单词 payments,它 proxy_pass 到另一个服务?

更新:

让它更简单

我尝试过的一些事情

好像nginx不喜欢的是数字

有效

# Example URL = http://localhost/offer/
 location ^~ /offer/ {
                proxy_pass http://payment-docker.local:20000/init;
         }

这行不通。一旦有数字正则表达式,它总是 returns 404

# Example URL = http://localhost/offer/3
     location ^~ /offer/([0-9]+) {
                    proxy_pass http://payment-docker.local:20000/init;
             }
# Example URL = http://localhost/offer/33
     location ^~ "/offer/[\d]{2}" {
                    proxy_pass http://payment-docker.local:20000/init;
             }

你能试试这个吗?据我所知,nginX 使用最长的正则表达式匹配位置。

location /offer {
            rewrite ^/offer/(.*)$ /offer/ break;
            proxy_pass http://localhost:4000/;
        }

#my ideal /offer/44/payments/*
location ~ ^/offer/([0-9]+)/payment/(.*)$ {
            rewrite ^/offer/([0-9]+)/payment/(.*)$ /init/payment/ break;
            proxy_pass http://payment-docker.local:20000;
        }