测试 nginx 变量是否已设置

测试 nginx 变量是否已设置

如果尚未设置,我需要将变量设置为默认值。以下配置可完成此工作:

if ($foo ~ "^$") {
   set $foo default-value;
}

但它会产生运行时警告:

使用未初始化的“foo”变量

有没有办法测试变量是否设置而不生成警告并且不全局关闭警告:

uninitialized_variable_warn off;

答案1

我使用以下方法检查变量是否存在:

if ($dir = false) {
    set $dir "";
}

如果在到达此位置块之前未设置,则它将设置为空白字符串。您也可以轻松地在引号之间添加字符串。使用此方法进行配置测试时,我没有收到任何错误。

如果您发现其他情况,请告诉我。

答案2

对于使用 的查询参数值,行为似乎已更改或至少有所不同$arg_<name>。在 nginx 1.13.6 上,使用以下命令检查 ngx 变量中的查询值是否存在:

if ($arg_test = false) {
    default_type 'text/plain';
    return 404;
}

没有传递到 404。使用:

if ($arg_test = '') {
    default_type 'text/plain';
    return 404;
}

如果查询参数不存在,则返回 404。如果必需的查询参数不存在,则不会命中上游。

答案3

如果GET QUERY参数检测

例如: foo.com?proxy proxy变量存在 请勿使用$arg_proxy

if ($args ~ '(&|^)proxy([&=]|$)' ) { #exists set $port '8080'; } https://forum.nginx.org/read.php?2,224860,224860

答案4

我认为简单的答案是你应该使用map,但这里或类似问题中的任何答案都不是适合我在最新 Nginx 版本中使用方法的方法,因此对于那些情况,下面的方法似乎有效。

就我而言,我需要有条件地覆盖主机标头,在由许多站点共享的包含的通用配置文件中,同时仅为需要它的站点设置该标头。

在这种情况下,在您的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"

最后两个错误出现在遵循以下答案时这个问题

相关内容