我對 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=.......
不應發送的範例網址。
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;
}