Test, ob die Nginx-Variable gesetzt ist

14

Ich muss eine Variable auf einen Standardwert setzen, wenn dieser noch nicht festgelegt ist. Folgende Konfiguration erledigt den Job:

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

Es werden jedoch Laufzeitwarnungen generiert:

Verwenden einer nicht initialisierten "foo" -Variable

Gibt es eine Möglichkeit zu testen, ob eine Variable gesetzt ist, ohne die Warnung zu generieren und ohne die Warnung global zu deaktivieren?

uninitialized_variable_warn off;
Jan Wrobel
quelle
Versuchen Sie es set_if_emptyunter github.com/openresty/set-misc-nginx-module
SaveTheRbtz
2
Ich habe dies gerade gefunden uninitialized_variable_warn, als ich nach etwas Ähnlichem gesucht habe, aber es scheint, als ob es nicht global festgelegt werden muss. Sie können es einfach dort festlegen, wo Sie möglicherweise nicht initialisierte Variablen verwenden müssen. Ich benutze dies, um SSL-Details an PHP zu übergeben, das leer ist, wenn auf die Seite ohne SSL zugegriffen wird.
Haravikk
@ Haravikk es sieht aus wie das nicht der Fall istnginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te
Hast du es noch woanders eingestellt? Ich benutze es uninitialized_variable_warnals Teil eines php.conf, das nur von Orten importiert wird, die PHP unterstützen, also benutze ich es definitiv nur in diesen Bereichen, während ich die Warnung an anderer Stelle lasse. Ich habe jedoch uninitialized_variable_warnkeinen anderen Bereich festgelegt (Standardeinstellung ist true).
Haravikk

Antworten:

11

Ich benutze das Folgende, um zu prüfen, ob eine Variable existiert:

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

Wenn es nicht gesetzt ist, bevor es diesen Positionsblock erreicht, wird es auf eine leere Zeichenkette gesetzt. Sie können genauso einfach eine Zeichenfolge zwischen die Anführungszeichen einfügen. Ich erhalte keine Fehler, wenn ich einen Konfigurationstest mit dieser Option durchführe.

Bitte lassen Sie mich wissen, wenn Sie etwas anderes sehen.

jaseeey
quelle
Ich sehe nginx: [emerg] unbekannte "dir" -Variable
Alex Barker
Diese falsche Prüfung funktioniert nicht mehr, bitte benutzen Sie$foo ~ "^$"
Valdrinium
1

Das Verhalten scheint sich bei Verwendung von Abfrageparameterwerten geändert zu haben oder zumindest anders zu sein $arg_<name>. Verwenden Sie unter nginx 1.13.6 Folgendes, um zu überprüfen, ob ein Abfragewert in der Variablen ngx vorhanden ist:

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

geht nicht auf den 404 über.

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

Gibt 404 zurück, wenn der Abfrageparameter nicht existiert. Dies ist nützlich, wenn kein Upstream ausgeführt werden soll, wenn ein erforderlicher Abfrageparameter nicht vorhanden ist.

Timbo
quelle
0

Wenn Sie die Variable in einer eingeschlossenen Datei optional festlegen, können Sie einfach zuerst den Standardwert festlegen.

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

Die zweite set-Anweisung in der conf-Datei ersetzt den Standardwert.

Sam Bull
quelle