Sprawdź, czy ustawiona jest zmienna nginx

15

Muszę ustawić zmienną na wartość domyślną, jeśli nie jest jeszcze ustawiona. Następująca konfiguracja wykonuje zadanie:

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

Ale generuje ostrzeżenia w czasie wykonywania:

za pomocą niezainicjowanej zmiennej „foo”

Czy istnieje sposób sprawdzenia, czy zmienna jest ustawiona bez generowania ostrzeżenia i bez globalnego wyłączania ostrzeżenia za pomocą:

uninitialized_variable_warn off;
Jan Wróbel
źródło
spróbuj set_if_emptyna github.com/openresty/set-misc-nginx-module
SaveTheRbtz
2
Właśnie to znalazłem, szukając czegoś podobnego, ale wygląda na to, że uninitialized_variable_warnnie trzeba go ustawiać globalnie, możesz po prostu ustawić to w miejscu, w którym potrzebujesz użyć potencjalnie niezainicjowanych zmiennych. Używam tego do przekazywania szczegółów SSL do PHP, który będzie pusty, jeśli strona będzie dostępna bez SSL.
Haravikk,
@Haravikk wygląda na to, że tak nie jestnginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te
Czy nadal masz to ustawione gdzieś indziej? Używam uninitialized_variable_warnjako części php.confimportowanej tylko przez lokalizacje, które obsługują PHP, więc zdecydowanie używam go tylko w tych zakresach, pozostawiając ostrzeżenie wszędzie indziej. Nie uninitialized_variable_warnustawiłem jednak żadnego innego zakresu (pozwalając domyślnie na true).
Haravikk

Odpowiedzi:

11

Korzystam z poniższych, aby sprawdzić, czy zmienna istnieje:

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

Jeśli nie zostanie ustawiony przed osiągnięciem tego bloku lokalizacji, ustawi go na pusty ciąg. Równie łatwo możesz dodać ciąg między cytatami. Nie otrzymuję żadnych błędów podczas wykonywania testu konfiguracji przy użyciu tego.

Daj mi znać, jeśli widzisz inaczej.

jaseeey
źródło
Widzę zmienną „dir” nginx: [emerg]
Alex Barker,
1
Ten fałszywy test już nie działa, użyj$foo ~ "^$"
Valdrinium
2

Wygląda na to, że zachowanie uległo zmianie lub przynajmniej różni się w przypadku wartości parametrów zapytania przy użyciu $arg_<name>. W wersji nginx 1.13.6 za pomocą następujących poleceń można sprawdzić, czy istnieje wartość zapytania w zmiennej ngx:

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

nie przechodzi do 404. Używając:

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

zwraca 404, jeśli parametr zapytania nie istnieje. Przydatne w przypadku nie trafiania w górę, jeśli wymagany parametr zapytania nie istnieje.

timbo
źródło
0

Łatwą opcją, jeśli opcjonalnie ustawiasz zmienną w dołączonym pliku, jest najpierw ustawienie wartości domyślnej.

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

Druga instrukcja set w pliku conf zastąpi wartość domyślną.

Sam Bull
źródło