Проверьте, установлена ​​ли переменная nginx

14

Мне нужно установить значение переменной по умолчанию, если оно еще не установлено. Следующий конфиг делает работу:

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

Но он генерирует предупреждения во время выполнения:

используя неинициализированную переменную "foo"

Есть ли способ проверить, установлена ​​ли переменная, не генерируя предупреждение и не отключая предупреждение глобально с помощью:

uninitialized_variable_warn off;
Ян Вробель
источник
попробуйте set_if_emptyс github.com/openresty/set-misc-nginx-module
SaveTheRbtz
2
Просто нашел это, когда искал что-то похожее, но кажется, что uninitialized_variable_warnего не нужно устанавливать глобально, вы можете просто установить его там, где вам нужно использовать потенциально неинициализированные переменные. Я использую это для передачи деталей SSL в PHP, который будет пустым, если страница доступна без SSL.
Харавикк
@Haravikk похоже, что это не такnginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te
У вас все еще есть что-то еще? Я использую uninitialized_variable_warnкак часть, php.confкоторая импортируется только в места, которые поддерживают PHP, поэтому я определенно использую его только в этих областях, оставляя предупреждение везде. Я не uninitialized_variable_warnустановил в любой другой области, хотя (позволяя по умолчанию true).
Харавикк

Ответы:

11

Я использую следующее, чтобы проверить, существует ли переменная:

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

Если он не установлен до того, как достигнет этого блока местоположения, он установит пустую строку. Вы можете так же легко добавить строку между кавычками. Я не получаю никаких ошибок при выполнении теста конфигурации с использованием этого.

Пожалуйста, дайте мне знать, если вы видите иначе.

jaseeey
источник
Я вижу nginx: [emerg] неизвестная переменная "dir"
Алекс Баркер
Эта ложная проверка больше не работает, пожалуйста, используйте$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, если параметр запроса не существует. Полезно, чтобы не переходить в восходящий поток, если обязательный параметр запроса не существует.

Timbo
источник
0

Если GET QUERYобнаружение параметра

например: foo.com?прокси proxyпеременная существует Не использовать$arg_proxy

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

Хо Илио
источник
0

Простой вариант, если вы необязательно устанавливаете переменную во включаемом файле, это просто сначала установить значение по умолчанию.

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

Второй оператор set в файле conf заменит значение по умолчанию.

Сэм Булл
источник