私は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応答、および1200応答。これは予想されますか?もしそうなら、nginxに追加の負荷を作成したように見えるので、リクエストが1つだけになるようにこれを行うためのより良い方法があります。
#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;
}
次のコードで解決しました
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;
}