测试是否设置了nginx变量


14

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

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

但是它会生成运行时警告:

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

有没有一种方法可以测试是否设置了变量而不生成警告,也没有通过以下方式全局关闭警告:

uninitialized_variable_warn off;


2
只是在寻找类似内容时发现了这一点,但似乎uninitialized_variable_warn不需要全局设置,您可以将其设置为需要使用可能未初始化的变量的地方。我正在使用它来将SSL详细信息传递给PHP,如果在没有SSL的情况下访问该页面,该信息将为空。
Haravikk

@Haravikk似乎并非如此nginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te

您还在其他地方设置它吗?我使用的是仅由支持PHP的位置导入uninitialized_variable_warn的a php.conf的一部分,因此我肯定只在那些范围内使用它,而在其他地方留下警告。我没有uninitialized_variable_warn设置其他任何范围(将其默认设置为true)。
哈拉维克

Answers:


11

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

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

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

如果您另有说明,请告诉我。


我看到nginx:[emerg]未知的“ dir”变量
Alex Barker

此伪支票不再有效,请使用$foo ~ "^$"
Valdrinium,

1

对于使用的查询参数值,该行为似乎已更改或至少有所不同$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。如果不存在必需的查询参数,则对于不命中上游很有用。



0

如果您可以选择在包含的文件中设置变量,一个简单的选择就是简单地先设置默认值。

set $value 'default';
include maybe-set-value.conf;

conf文件中的第二个set语句将替换默认值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.