使用 set 在 nginx 中设置默认变量

使用 set 在 nginx 中设置默认变量

在 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;

这是我发现的唯一避免的方法:

  1. error.log 中出现大量警告,指出using uninitialized "proxied_host" variable
  2. 与在映射中使用未初始化变量相关的错误,例如nginx: [emerg] unknown "proxied_host" variable
  3. 与变量循环相关的错误cycle while evaluating variable "proxied_host"

相关内容