Nginx 根据参数中的关键字进行重定向

Nginx 根据参数中的关键字进行重定向

我对 nginx 还很陌生(大约 1 天),我们正在将其用作一些应用程序的反向代理。我们将添加另一个应用程序来处理一小部分现有请求。我试图拦截命中 cod/articles API 并在参数中包含 item.id 的 URL,然后将这些请求及其参数发送到这个新应用程序,由于它尚未准备好,我暂时将其存根化。

我想保留所有其他请求,即 API 不是“/cod/acticles”,请求在参数中不包含 item.id。

应发送到新应用程序的示例 URL。

http://server/mdata/transfer/CUSTOMER/cod/articles?filter={"item.id":"ID00000000123"......}&limit=50&fields=[]&sort=.......

不应发送的示例 URL。

http://server/mdata/transfer/customer/cod/articles?filter{"lang":"en_US","article.id":"123456"}&limit=50....
http://server/mdata/transfer/customer/cod/items?filter{"lang":"en_US","article.id":"123456"}&limit=50....
http://server/mdata/transfer/customer/doc/articles?filter{"lang":"en_US","article.id":"123456"}&limit=50....

注意:.... 只是意味着还有其他参数

以下是我目前在 Nginx 中的配置。它似乎在进行“拦截”,但有几件事在我看来是错误的。

首先,我认为使用“if”并不理想,可能有更好的方法。但我无法成功匹配参数部分。

其次,nginx 访问日志显示匹配 url 的 3 个请求。x2 301 响应和 1 200 响应。这是预期的吗?如果是这样,有没有更好的方法来实现这一点,以便只有 1 个请求,因为看起来我为 nginx 创建了额外的负载。

#existing config for all /mdata/transfer/* APIs
location /mdata/transfer/ {
        add_header Access-Control-Allow-Origin *;
        allow all;
        proxy_pass        http://mds;
}

#static page which acts as a stub end point for testing.
location /proxyapp {
        root /opt/www;
}

#new config where I try to intercept /mdata/transfer/customer/cod/articles API with item.id contained in the arguments.
location ~ /mdata/transfer/customer/cod/articles {
        set $cst_proxy mds/mdata/transfer/customer/cod/articles;
        if ($args ~ "item.id") {
                set $cst_proxy localhost/proxyapp;
        }
        proxy_pass http://$cst_proxy$is_args$args;
        proxy_redirect off;
}

答案1

使用以下代码解决了这个问题

   upstream proxy-app {
    server 127.0.0.1:4000;
}

upstream mds {
    server 127.0.0.1:1234;
}

location /mdata/transfer/CUSTOMER/cod/articles {
        add_header Access-Control-Allow-Origin *;
        set $cst_proxy mds;
        if ($args ~ "item.id") {
                set $cst_proxy proxy-app;
        }
        proxy_pass http://$cst_proxy;
}

相关内容