如果尚未设置,我需要将变量设置为默认值。以下配置可完成此工作:
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;
这是我发现的唯一避免的方法:
- error.log 中出现大量警告,指出
using uninitialized "proxied_host" variable
- 与在映射中使用未初始化变量相关的错误,例如
nginx: [emerg] unknown "proxied_host" variable
- 与变量循环相关的错误
cycle while evaluating variable "proxied_host"
最后两个错误出现在遵循以下答案时这个问题