Ответ 1
Вы можете сделать небольшой трюк. Если это значение должно быть доступно из каждого блока server
в одном блоке http
, вы можете использовать директиву map
. Как это будет работать?
Директива map
позволяет вам использовать переменную где угодно в блоке http
, значение которой будет вычисляться на каком-либо ключевом ключе. Всеобъемлющий пример:
http {
...
/*
value for your $my_everywhere_used_variable will be calculated
each time when you use it and it will be based on the value of $query_string.
*/
map $query_string $my_everywhere_used_variable {
/*
if the actual value of $query_string exactly match this below then
$my_everywhere_used_variable will have a value of 3
*/
/x=1&y=2&opr=plus 3;
/*
if the actual value of $query_string exactly match this below then
$my_everywhere_used_variable will have a value of 4
*/
/x=1&y=4&opr=multi 4;
/*
it needs to be said that $my_everywhere_used_variable value is calculated each
time you use it. When you use it as pattern in a map directive (here we used the
$query_string variable) some variable which will occasionally change
(for example $args) you can get more flexible values based on specific conditions
*/
}
// now in server you can use this variable as you want, for example:
server {
location / {
rewrite .* /location_number/$my_everywhere_used_variable;
/*
the value to set here as $my_everywhere_used_variable will be
calculated from the map directive based on $query_string value
*/
}
}
}
Итак, что это значит для вас? Вы можете использовать директиву map
для установки глобальной переменной для всех блоков server
с помощью этого простого трюка. Вы можете использовать ключевое слово default
, чтобы установить значение по умолчанию для вашего значения карты. Как в этом простом примере:
map $host $my_variable {
default lalalala;
}
В этом примере мы вычисляем значение $my_variable
по значению $host
, но на самом деле не имеет значения, что $host
, потому что мы всегда будем устанавливать lalalala как значение для нашей переменной по умолчанию и без другие варианты. Теперь везде в вашем коде, когда вы будете использовать $my_variable
так же, как и все другие доступные переменные (например, созданные с помощью директивы set
), вы получите значение lalalala
И почему это лучше, чем просто использовать директиву set
? Поскольку директива set
, поскольку doc говорит, что директива set nginx доступна только внутри блоков server, location and if
, поэтому ее нельзя использовать для создания глобальной переменной для нескольких блоков server
.
Документы о директиве map
доступны здесь: директива карты