Назад | Перейти на главную страницу

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

Ну у меня есть немного другой вопрос, чем этот: Я не хочу отображать две переменные одновременно, я хочу сопоставить одну переменную, используя две другие в качестве параметров.

Действительно я прочитал в документации о директиве карты, которая:

До версии 0.9.0 в первом параметре можно было указать только одну переменную.

Итак, поскольку у меня есть nginx 1.8, я ожидаю, что смогу использовать более одной переменной в первом параметре.

Это навело меня на мысль, что я мог бы написать что-то вроде двух последних директив карты в этом примере:

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"

)

Итак, как можно указать несколько переменных в первом параметре? Или что на самом деле означает документация, если я ее неправильно понял?

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

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

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