如何在nginx conf文件中定义全局变量,在http块中定义全局变量,以下所有服务器和位置都可以使用它。
http{
some confs
...
//define a global var mabe like
set APP_ROOT /home/admin
// and it can be use in all servers and locations below, like
server {
root $APP_ROOT/test1
}
server {
root $APP_ROOT/test2
}
}
答案 0 :(得分:75)
你可以做一个小技巧。如果必须可以从一个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's 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 < / em>默认情况下作为变量的值,没有其他选项。现在代码中的任何地方都会以与所有其他可用变量相同的方式使用$my_variable
(例如使用set
指令创建),您将获得 lalalala 的值
为什么这比简单地使用set
指令更好?因为set
指令,因为文档说nginx set directive只能在server, location and if
块中访问,所以它不能用于为多个server
块创建全局变量。
有关map
指令的文档可在此处找到:map directive