2016-12-11 1 views
0

여러 토큰 번호에 관해서는 재 작성에 몇 가지 문제가 있습니다.Nginx Regex Multiple Token (+)으로 다시 작성

API의 버전 관리를 위해 최선을 다하고 있으므로 더 이상 사용되지 않는 버전 호출은 최신 버전으로 변경됩니다. 단순화를 위해 v4v5을 지원한다고 가정 해 보겠습니다. 어떤 경우에는 v1-3이 표시되고 v5으로 가야합니다. 마찬가지로 누군가 v6에 도달하면 v5으로 이동해야합니다.

우리 nginx.conf 상류와 proxy_pass 그래서 난 각 버전은

upstream v4 { 
    server 127.0.0.1:3000 
} 

upstream v5 { 
    server 127.0.0.1:3001 
} 

은 우리가

location ^~ /v5 { 
    proxy_pass $scheme://v5; 
} 

location ^~ /v4 { 
    proxy_pass $scheme://v4; 
} 

location ~* "^/v[0-9]+" { 
    rewrite ^/v[0-9]+/(.*)$ /$latestVersion/$1; 
    proxy_pass $scheme://$latestUpstream; 
} 

마지막 위치 블록 작품 v0-9을위한 프록시에 위치 블록을 사용하여 다른 포트에서 실행해야합니다 하지만 +을 사용하고 있지만 숫자가 v11과 같이 여러 자릿수 일 때이를 포착하지 못합니다.

위의 사항에 대한 도움이 될 것입니다. 이것으로 정말 혼란스러워. 감사! 다음 블록

답변

0

:

location ~* "^/v[0-9]+" { 
    rewrite ^/v[0-9]+/(.*)$ /$latestVersion/$1; 
    proxy_pass $scheme://$latestUpstream; 
} 

rewrite 문 URI 결국 거의 중복이 블록에서 proxy_pass 문 렌더링 상기 location ^~ /v5 블록에 의해 처리되는 것을 의미 암시 rewrite ... last를 행한다. rewrite 구문에 대해서는 this document을 참조하십시오.

rewrite는 URI가/ 후행, 예를 들면없이 혼자 버전 문자열로 표시되는 경우 일치하지 /v11.

버전 문자열 다음에 /을 입력해야합니다. (location 구문 this document 참조)

location ^~ /v { 
    rewrite ^/v[0-9]+(/.*)$ /$latestVersion$1 last; 
} 

정규식 location 블록

아마 불필요하므로 I는 짧은 프리픽스 location 치환 가지고 시도.

나는 rewrite의 의도를 명확하게하기 위해 last 접미사를 추가했습니다.


편집 : URI를 /v5/v51을 구별 의견

에 응답 (즉, 후행 /없이) 혼자 접두사를 location 블록을 사용하여 문제가있다. 항상이 (최소한) 버전 문자열 다음에 /이라는 꼬리가있는 경우 두 개의 기존 location 블록에 후미 /을 추가하면 쉽게 해결할 수 있습니다.

/v5/v51과 같은 짧은 URI가 필요하다고 가정하면 솔루션을 일반 표현식 location 블록으로 전환해야합니다.

정규식 location 블록이 다르게 평가되며 그 순서가 중요하다는 점에 유의하십시오. 이 location 블록을 다른 일반 표현식 location 블록보다 먼저 이동해야 구성 파일의 다른 코드에 의해 덮어 쓰지 않도록 할 수 있습니다. 예를 들어

하십시오 정규 표현식를 소개 수정이 ~*로 변경되는 것을

location ~* ^/v5(/|$) { 
    proxy_pass $scheme://v5; 
} 
location ~* ^/v4(/|$) { 
    proxy_pass $scheme://v4; 
} 
location ~* ^/v[0-9] { 
    rewrite ^/v[0-9]+(/.*)$ /$latestVersion$1 last; 
} 

고지 (도하게 그것을 대소 문자를 구별 - 또는 당신에게 중요하지 않을 수있다).

+0

설명해 주셔서 감사합니다. 정말 도움이되었습니다. '/ v40..9 '와'/ v50 ... 9'가'/ v4 '와'/ v5' 위치로가는 예상치 못한 동작을 발견했습니다. 위치. 그것에 대한 제안이 있습니까? 나는'(/ | $)'와 같은 정규식을 시도했지만 작동하지 않았다. – Dan