在 nginx 中我可以用来set
定义一个变量,但是可以定义一个默认值吗?
例如
set $foo bar if $foo is not defined
答案1
map $foo $new_foo {
default $foo;
'' bar;
}
或者
if ($foo = '') {
set $foo bar;
}
答案2
这也有效:
map $foo $foo {
default '';
}
map $foo $bar {
default '';
'bar' 'bar';
'foo' $foo; <----- nginx: [emerg] unknown "foo" variable
}
map $foo $foo {}
解决了错误nginx: [emerg] unknown "foo" variable
- 虽然看起来不对 - 但是它有效。
注意:map
必须在块内http {}
(nginx/conf.d
)
答案3
map $foo $foo {}
cycle while evaluating variable "foo"
在 nginx 错误日志中给出错误消息。
现在,
map $foo $foo_with_default {
default 'bar';
~. $foo;
}
确实有效,而且语义上也是正确的:如果正则表达式匹配任何内容,则结果将是,$foo
如果不匹配,则没有字符可匹配,因此它变为bar
。我不认为 nginx 的配置语法可以区分空字符串和未定义的变量。我相信您需要 openresty 和 nil 检查。
答案4
截至目前的 Nginx 版本 2023(v1.20+),上述方法似乎不起作用,并且在将这些方法添加到时,在我的使用中都会产生警告或启动失败nginx.conf
。
就我而言,我需要有条件地覆盖主机标头,在由许多站点共享的包含的通用配置文件中,同时仅为需要它的站点设置该标头。
在这种情况下,在您的http
块中(例如nginx.conf
):
map '' $proxied_host {
default '';
}
map "$proxied_host" $resolved_host {
default $host;
~. $proxied_host;
}
并在每个位置包含的配置文件中:
proxy_set_header Host $resolved_host:$server_port;
然后在需要覆盖它的站点中,在位置块中:
set $proxied_host your.example.com;
这是我发现的唯一避免的方法:
- error.log 中出现大量警告,指出
using uninitialized "proxied_host" variable
- 与在映射中使用未初始化变量相关的错误,例如
nginx: [emerg] unknown "proxied_host" variable
- 与变量循环相关的错误
cycle while evaluating variable "proxied_host"