Как указать несколько переменных в директиве карты nginx


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
Алексей Тен

Может быть, это отчасти (а я не знал о них). Но я действительно думал, что это на самом деле невозможно, и есть кое-что, что я не могу понять в документации. Теперь понятно.
Zezollo

Ответы:


20

Вы неправильно поняли документы nginx. Это означает, что до версии 0.9 первый аргументmap должен быть единственной переменной и ничего больше. Начиная с версии 0.9.0 первым аргументом может быть любая строка с любым количеством переменных для интерполяции.

Вот как может выглядеть ваш первый блок:

map "$bot:$request"      $np {
    default              "";
    "~^yes:"             "";
    "~*^:.*newproject"   "yes";
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.