Nginx 다 if 조건 판단 에 따 른 URI 재 작성

2036 단어 DevOps
Nginx URI 재 작성 에 관 한 글 이 많 습 니 다. 기본적으로 rewrite 명령 으로 일치 하 는 URI 를 재 작성 할 것 으로 바 꾸 면 됩 니 다. 그리고 뒤에 last 나 break 같은 것 을 따라 가 는 것 이 직접적 입 니 다.여기 서 공유 할 장면 은 다 중 if 조건 으로 판단 하고 다시 쓰 는 URI 부분 은 기 존의 URI 에서 나 온 것 입 니 다.
 
배경 은 이 렇 습 니 다. 저 는 두 개의 서비스 A 와 B 가 있 습 니 다. A 를 요청 하 는 URI 에 인자 collectSource = true 가 포함 되 어 있 고 POST 요청 이 있 을 때 기 존의 URI / i18n / api / xxxx? collectSource = true 를 / i18n / source / api / xxxx? collectSource = true 로 바 꾸 고 서비스 B 단 에 보 냅 니 다.
collectSource = true 와 POST 요청 두 조건 을 두 location 일치 에 분산 합 니 다.첫 번 째 if 조건 이 collectSource = true 와 일치 하면 URI 를 다시 쓰 고 i18n 뒤에 source 라 는 경 로 를 추가 하고 last 로 location 을 계속 일치 시 킨 다음 두 번 째 location 에 일치 합 니 다. 두 번 째 if 에 들 어가 서 판단 합 니 다. 요청 방법 이 POST 라면 proxypass 는 서비스 B 에 대 리 됩 니 다. POST 가 아니라면 원래 의 URI (즉 source 라 는 경 로 를 가지 고 있 지 않 습 니 다) 를 복원 합 니 다.
여기 proxy패스 명령 은 맨 뒤에 '/' 를 넣 거나 넣 지 않 는 것 이 큰 차이 가 있 기 때문에 특히 주의해 야 한다.나 는 두 번 째 if 판단 에서 '/' 를 사용 하지 않 았 다. 그러면 그것 은 사실은 상대 적 인 경로 이다. 즉,https://serverA:8090뒤에 location 에 맞 는 내용 / i18n / source / xxxx 를 더 해서 다 쓰 면 됩 니 다.https://serverA:8090/i18n/source/api/xxxx?collectSource=true。마지막 proxypass 에 '/' 를 추가 한 것 은 절대적 인 경 로 를 나타 낸다. 즉,https://serverA:8090/i18n/뒤에 location 일치 조건 의 / i18n / source / 이후 경 로 를 추가 합 니 다. / i18n / source / 를 포함 하지 않 습 니 다. 그러면 원래 의 URI 경 로 를 복원 합 니 다.https://serverA:8090/i18n/api/xxxx?collectSource=true。
마지막 으로 주의해 야 할 문 제 는 POST 가 요청 한 URI 를 다시 쓸 때 rewrite 뒤에 http 또는 https 가 시작 하 는 경 로 를 따 르 면 POST 요청 은 GET 가 되 고 요청 체 의 데 이 터 를 잃 어 버 리 기 때문에 proxy 를 사용 합 니 다.패스 이런 식 으로.
      location / {
            ...
            ...
            if ( $args ~* ^(.*)collectSource=true\b(.*)$ ){
                 rewrite /i18n/(.*) /i18n/source/$1 last;
            }
            proxy_pass https://serverA:8090;
       }

       location /i18n/source/ {
            if ( $request_method = POST ){
                 proxy_pass  https://serverB:8088;
            }
            proxy_pass https://serverA:8090/i18n/;
       }

좋은 웹페이지 즐겨찾기