私は 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 応答です。これは想定内ですか? もしそうなら、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;
}
答え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;
}