ちょっとしたトリックができます。この値がserver
1 つのブロック内のすべてのブロックからアクセスできる必要がある場合は、ディレクティブ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
が、実際には、デフォルトで変数の値として常にlalalala$host
を設定し、他のオプションを使用しないため、それが何であるかは問題ではありません。他のすべての使用可能な変数 (たとえば、ディレクティブで作成された変数) と同じ方法で使用すると、コードのどこでもlalalalaの値を取得できます。$host
$my_variable
set
set
そして、なぜこれは単にディレクティブを使用するよりも優れているのでしょうか? set
doc が言うように、ディレクティブはブロック内でしかアクセスできないため、複数のブロックserver, location and if
のグローバル変数を作成するために使用することはできません。server
ディレクティブに関するドキュメントmap
は、こちらから入手できます: map ディレクティブ