根据URL子路径将代理保留到不同的位置

时间:2019-01-30 17:51:56

标签: nginx nginx-location nginx-reverse-proxy

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

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

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

但是,当我拥有网址/offer/44/payments/*时,我又会增加一层复杂性,然后应该将其路由到另一个服务中

我尝试了很多不同的嵌套位置变体,但似乎payments无效。尝试执行以下操作(重定向是目前的基本操作,因为我正试图使其仅进行重定向...,但理想情况下,我希望它将payment之后的所有内容都放入另一个服务URL中)

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

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

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

所以我的问题是:如何进行本地嵌套工作,以便在payments之后看到offer一词,然后将其proxy_pass传递给另一个服务?

已更新:

使其更加简化

我尝试过的一些事情

nginx不喜欢的是数字

这有效

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

这不起作用。一旦有数字正则表达式,它总是返回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;
             }

1 个答案:

答案 0 :(得分:0)

您可以尝试吗?据我所记得,nginX使用最长匹配来匹配正则表达式。

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

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