Como especificar várias variáveis ​​na diretiva de mapa do nginx

10

Bem, eu tenho uma pergunta um pouco diferente desta : não quero mapear duas variáveis ​​ao mesmo tempo, quero mapear uma variável usando duas outras como parâmetros.

Na verdade, li na documentação sobre a diretiva de mapa que:

Antes da versão 0.9.0, apenas uma única variável podia ser especificada no primeiro parâmetro.

Portanto, como tenho o nginx 1.8, espero poder usar mais de uma única variável no primeiro parâmetro.

Isso me levou a pensar que eu poderia escrever algo como as duas últimas diretivas de mapa neste exemplo:

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

Mas não funciona ( nginx -tretorna um

número inválido de argumentos na diretiva "map"

)

Então, como é possível especificar várias variáveis ​​no primeiro parâmetro? Ou, o que realmente significa a documentação, se eu a entendi mal?

zezollo
fonte
Eu adicionei uma resposta para a pergunta, mas na verdade esta pergunta parece um XY-problema meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Alexey Dez
Talvez seja do tipo (e eu não os conhecia). Mas eu estava realmente pensando que não é possível e há algo que sinto falta de entender na documentação. Está claro agora.
zezollo

Respostas:

20

Você não entendeu os documentos do nginx. Isso significa que, antes da versão 0.9, o primeiro argumento do mapdeve ser variável única e nada mais. Desde a versão 0.9.0, o primeiro argumento pode ser qualquer string com qualquer número de variáveis ​​para interpolar.

Aqui está como seu primeiro bloco pode ser:

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