Проверьте, установлена ​​ли переменная 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 "";
}

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

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


Я вижу 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, если параметр запроса не существует. Полезно, чтобы не переходить в восходящий поток, если обязательный параметр запроса не существует.



0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.