Comment spécifier plusieurs variables dans la directive map de nginx

10

Eh bien, j'ai une question légèrement différente de celle-ci : je ne veux pas mapper deux variables en même temps, je veux mapper une variable en utilisant deux autres comme paramètres.

En effet, j'ai lu dans la documentation sur la directive map que:

Avant la version 0.9.0, une seule variable pouvait être spécifiée dans le premier paramètre.

Donc, comme j'ai nginx 1.8, je m'attends à pouvoir utiliser plus d'une seule variable dans le premier paramètre.

Cela m'a amené à penser que je pouvais écrire quelque chose comme les deux dernières directives de carte dans cet exemple:

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"   ""      "";
}

Mais cela ne fonctionne pas ( nginx -trenvoie un

nombre d'arguments non valide dans la directive "map"

)

Alors, comment est-il possible de spécifier plusieurs variables dans le premier paramètre? Ou, que signifie réellement la documentation, si je l'ai mal comprise?

zezollo
la source
J'ai ajouté une réponse à la question, mais en fait, cette question ressemble à un problème XY meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Alexey Ten
C'est peut-être un peu (et je ne les connaissais pas). Mais je pensais vraiment que ce n'était pas possible et il y a quelque chose qui me manque dans la documentation. C'est clair maintenant.
zezollo

Réponses:

20

Vous avez mal compris les documents de nginx. Cela signifie qu'avant la version 0.9, le premier argument de la mapdoit être une variable unique et rien d'autre. Depuis la version 0.9.0, le premier argument peut être n'importe quelle chaîne avec un nombre quelconque de variables à interpoler.

Voici à quoi pourrait ressembler votre premier bloc:

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