So geben Sie mehrere Variablen in der Map-Direktive von nginx an

9

Nun, ich habe eine etwas andere Frage als diese : Ich möchte nicht zwei Variablen gleichzeitig zuordnen, sondern eine Variable mit zwei anderen als Parametern zuordnen.

In der Tat habe ich in der Dokumentation über die Kartenrichtlinie gelesen, dass:

Vor Version 0.9.0 konnte im ersten Parameter nur eine einzige Variable angegeben werden.

Da ich also Nginx 1.8 habe, erwarte ich, dass ich im ersten Parameter mehr als eine einzelne Variable verwenden kann.

Dies führte mich zu der Annahme, dass ich so etwas wie die beiden letzten Kartenanweisungen in diesem Beispiel schreiben könnte:

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

Aber es funktioniert nicht ( nginx -tgibt a zurück

Ungültige Anzahl von Argumenten in der Direktive "map"

)

Wie ist es also möglich, im ersten Parameter mehrere Variablen anzugeben? Oder was bedeutet eigentlich die Dokumentation, wenn ich sie falsch verstanden habe?

Zezollo
quelle
Ich habe eine Antwort auf die Frage hinzugefügt, aber tatsächlich sieht diese Frage aus wie ein XY-Problem meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Alexey Ten
Vielleicht ist es irgendwie (und ich wusste nichts über sie). Aber ich dachte wirklich, dass es eigentlich nicht möglich ist und es gibt etwas, das ich in der Dokumentation nicht verstehe. Es ist jetzt klar.
Zezollo

Antworten:

18

Sie haben die Dokumente von nginx falsch verstanden. Dies bedeutet, dass vor Version 0.9 das erste Argument der mapeinzelnen Variablen und sonst nichts sein muss. Seit Version 0.9.0 kann das erste Argument eine beliebige Zeichenfolge mit einer beliebigen Anzahl von zu interpolierenden Variablen sein.

So könnte Ihr erster Block aussehen:

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