저는 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;
}