【问题标题】:Reserve proxy to different locations based on URL subpath基于 URL 子路径的不同位置的反向代理
【发布时间】:2019-01-31 20:13:09
【问题描述】:

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

Service offer 将处理路由 /offer/44 和其他路由,如 /offer/44/calculator 以下代码成功处理了该问题。

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

但是当我有 url /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;
            } 
        } 

所以我的问题是:我如何使本地嵌套工作,以便如果它在 offer 之后看到单词 payments 它将 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;
             }

【问题讨论】:

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


    【解决方案1】:

    你可以试试这个吗?据我所知,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;
            } 
    

    【讨论】:

    • 我收到以下错误 nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/etc/nginx/nginx.conf:47 它与位置 ~ ^ 应该是 ^~ 有关。但即使我改变了这一点,payment 路由也不会重定向。值得注意的数字可以是“1”、“11”、“112”。又名 1-3 位数字
    • 同样的问题。忘记靠近第一条路线。是有问题的号码的路线。即使我尝试像location ^~ /offer/([0-9]+) { 和一个简单的proxy_pass 而没有rewrite 也不起作用。问题是它不喜欢带有数字的正则表达式,无论出于何种原因
    • 当然不喜欢它们——操作^~ 表示The best non-regex match。如果您需要正则表达式 - 那么您应该坚持使用~(用于区分大小写的匹配)或~*(用于不区分大小写的匹配)。第一条路线根本不需要正则表达式。第二条路由使用来自rewrite 的结果URI 作为proxy_pass
    • 但即使在您的 location ~ ^/offer/([0-9]+)/ 示例中,也可以将其用作测试目的。 iit 在尝试reload 配置时抛出错误,如前所示。就像额外信息一样,我正在使用最新版本 nginx version: nginx/1.15.8,只需正常安装 brewnginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/etc/nginx/nginx.conf:45
    • 但我更新了位置块,使proxy_pass 不再包含 URI 部分 - 并将 URI 移动到 rewrite 指令的右侧。您也可以在这里在线查看 - nginx.viraptor.info
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 2019-06-23
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多