web-dev-qa-db-ja.com

nginxのmapディレクティブでいくつかの変数を指定する方法

まあ私は これとは少し異なる質問 :2つの変数を同時にマップするのではなく、他の2つをパラメーターとして使用して1つの変数をマップします。

実際、私は ドキュメント内 を読んで、次のマップディレクティブについて説明します。

バージョン0.9.0より前では、最初のパラメーターで指定できる変数は1つだけでした。

したがって、私はnginx 1.8を持っているので、最初のパラメーターで複数の変数を使用できると期待しています。

これにより、この例の最後の2つのマップディレクティブのようなものを書くことができると思いました。

map $http_user_agent $bot {
    default         "";
    "~*Googlebot"   "yes";
    "~*MJ12bot"     "yes";
    "~*bingbot"     "yes";
    etc.
}

map $request        $bot    $np {
    default         ""      "";
    default         "yes"   "";
    "~*newproject"  ""      "yes";
    "~*newproject"  "yes"   "";
}

map $bot    $np     $regular {
    ""      ""      "yes";
    ""      "yes"   "";
    "yes"   ""      "";
}

しかし、それは機能しません(nginx -t

「map」ディレクティブの引数の数が無効です

では、最初のパラメータでいくつかの変数を指定するにはどうすればよいでしょうか?または、ドキュメントを誤解した場合、実際にはドキュメントはどういう意味ですか?

9
zezollo

Nginxのドキュメントを誤解しています。つまり、バージョン0.9より前のmapの最初の引数は、単一の変数でなければならず、それ以外のものはありません。バージョン0.9.0以降、最初の引数は、補間する変数がいくつでもある文字列にすることができます。

最初のブロックは次のようになります。

map "$bot:$request"      $np {
    default              "";
    "~^yes:"             "";
    "~*^:.*newproject"   "yes";
}
18
Alexey Ten