如何在Nginx的map指令中指定几个变量


10

好吧,我有一个与此问题略有不同的问题:我不想同时映射两个变量,我想使用另外两个作为参数来映射一个变量。

实际上,我已经有关map指令的文档中阅读到:

在0.9.0版之前,只能在第一个参数中指定单个变量。

因此,由于我拥有nginx 1.8,因此我希望能够在第一个参数中使用多个变量。

这使我认为我可以在此示例中编写类似于最后两个map指令的内容:

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”指令中的参数数目无效

那么,如何在第一个参数中指定几个变量呢?或者,如果我误解了文档,这实际上意味着什么?


我已经为问题添加了答案,但实际上这个问题看起来像是一个XY问题meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Alexey

也许有点(我不知道他们)。但是我真正地认为这实际上是不可能的,并且在文档中我想了解一些东西。现在很清楚。
zezollo's

Answers:


20

您误解了Nginx的文档。这意味着在0.9版之前,的第一个参数map必须是单个变量,不能有其他变量。从0.9.0版开始,第一个参数可以是具有任意数量要插入变量的任何字符串。

这是您的第一个区块的样子:

map "$bot:$request"      $np {
    default              "";
    "~^yes:"             "";
    "~*^:.*newproject"   "yes";
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.