2016-12-11 18 views
0

複数のトークン番号については、書き直しにいくつか問題があります。Nginx Regex Multiple Token(+)で書き直し

私のAPIのバージョン管理に取り組んでいますので、廃止予定のバージョン呼び出しは最新のバージョンになります。わかりやすくするため、v4v5をサポートしています。一部のヒットがv1-3の場合、v5に移動する必要があります。同様に、誰かがv6にヒットした場合、それはv5にも行くはずです。

当社nginx.confはので、私は、各バージョンが別のポートで

upstream v4 { 
    server 127.0.0.1:3000 
} 

upstream v5 { 
    server 127.0.0.1:3001 
} 

を実行している上流でproxy_passを使用していますし、我々は

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 ^~ /v { 
    rewrite ^/v[0-9]+(/.*)$ /$latestVersion$1 last; 
} 

正規表現locationブロックはおそらく不要ですので、私は(location構文についてthis documentを参照)短いプレフィックスlocationを置換しています。

rewriteの目的を明確にするために、lastという接尾辞を追加しました。


EDIT:(末尾の/なしつまり)のURI /v5/v51

区別あなたのコメントへの対応だけでは接頭辞locationブロックを使用して問題があります。 のURIが常にの場合は、バージョン文字列の後に末尾に/という文字列がある場合は、locationという2つのブロックに末尾の/を追加するだけで簡単に解決できます。

/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'の場所に行き、 '/ v'で捕まえたいと思っている予期せぬ動作が見つかりましたロケーション。それについての提案はありますか?私は '(/ | $)'のような正規表現をしようとしましたが、うまくいきませんでした。 – Dan

関連する問題