Cómo especificar varias variables en la directiva de mapa de nginx

10

Bueno, tengo una pregunta un poco diferente a esta : no quiero asignar dos variables al mismo tiempo, quiero asignar una variable usando otras dos como parámetros.

De hecho, he leído en la documentación sobre la directiva de mapas que:

Antes de la versión 0.9.0, solo se podía especificar una sola variable en el primer parámetro.

Entonces, como tengo nginx 1.8, espero poder usar más de una variable en el primer parámetro.

Esto me llevó a pensar que podría escribir algo como las dos últimas directivas de mapas en este ejemplo:

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

Pero no funciona ( nginx -tdevuelve un

número inválido de argumentos en la directiva "mapa"

)

Entonces, ¿cómo es posible especificar varias variables en el primer parámetro? O, ¿qué significa realmente la documentación, si la entendí mal?

zezollo
fuente
He agregado una respuesta a la pregunta, pero en realidad esta pregunta parece un problema XY meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Alexey Ten
Tal vez es un poco (y no sabía sobre ellos). Pero realmente estaba pensando que en realidad no es posible y hay algo que extraño entender en la documentación. Está claro ahora.
zezollo

Respuestas:

20

Has entendido mal los documentos de nginx. Significa que antes de la versión 0.9 el primer argumento mapdebe ser una variable única y nada más. Desde la versión 0.9.0, el primer argumento podría ser cualquier cadena con cualquier número de variables para interpolar.

Así es como podría verse su primer bloque:

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