인수의 키워드를 기반으로 하는 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;
}

관련 정보