web-dev-qa-db-ja.com

Nginxロケーションマッチングでの変数キャプチャ

次のようなURLがあるとします:www.example.com/a/b/sth、そしてNginx configでロケーションブロックを記述します。

location ^~ /a/b/(?<myvar>[a-zA-Z]+) {
    # use variable $myvar here
    if ($myvar = "sth") { ... }
}

URLからキャプチャされた変数$myvarを使用できることを望んでいますinsideブロック、しかし、Nginxはこの変数が定義されておらず、起動しないことを通知し続けます:

nginx: [emerg] unknown "myvar" variable
35
skyork

Stefano Fratiniが彼の答えで正しく指摘したように、location宣言にはエラーがあります。正規表現には、~ではなく、^~のみを使用する必要があります。


名前付きキャプチャはPCREの機能であり、バージョンごとに使用可能な構文が異なります。 ?<var>を使用する構文の場合、少なくともPCRE 7.0が必要です。

公式のNginxドキュメント の詳細情報をご覧ください。

13

古いスレッドですが、同じ問題がありました...

エラーはインストールされているPCREバージョンとは関係ないと思います

ロケーションタグがで始まらない場合、NGINXは正規表現を解析しません〜このようなものを使用する必要があります

location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}
57
Stefano Fratini

^〜は正規表現の一致ではなく、最長一致プレフィックスを表します。代わりに〜または〜*(大文字と小文字を区別しない)を使用する必要があります

6
yabo

テストされていませんが、PCREを使用して名前付き変数にブロックをキャプチャする正しい方法は(?P)です。したがって、あなたの例はPを見逃しています。

3
Melvyn