Tester si la variable nginx est définie

14

J'ai besoin de définir une variable sur une valeur par défaut si elle n'est pas déjà définie. La configuration suivante fait le travail:

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

Mais il génère des avertissements d'exécution:

en utilisant la variable "foo" non initialisée

Existe-t-il un moyen de tester si une variable est définie sans générer l'avertissement et sans désactiver l'avertissement globalement avec:

uninitialized_variable_warn off;
Jan Wrobel
la source
essayez set_if_emptysur github.com/openresty/set-misc-nginx-module
SaveTheRbtz
2
Je viens de trouver cela en recherchant quelque chose de similaire, mais il semble que uninitialized_variable_warncela ne doive pas être défini globalement, vous pouvez simplement le définir là où vous devez utiliser des variables potentiellement non initialisées. J'utilise ceci pour transmettre des détails SSL à PHP, qui sera vide si la page est accessible sans SSL.
Haravikk
@Haravikk il semble que ce ne soit pas le casnginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te
L'avez-vous encore réglé ailleurs? J'utilise uninitialized_variable_warndans le cadre d'un php.confimporté uniquement par des emplacements qui prennent en charge PHP, donc je ne l'utilise certainement que dans ces étendues, tout en laissant l'avertissement partout ailleurs. Je n'ai cependant uninitialized_variable_warndéfini aucune autre portée (en le laissant par défaut true).
Haravikk

Réponses:

11

J'utilise ce qui suit pour vérifier si une variable existe:

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

S'il n'est pas défini avant qu'il n'atteigne ce bloc d'emplacement, il le définira sur une chaîne vide. Vous pouvez tout aussi facilement ajouter une chaîne entre les guillemets. Je ne reçois aucune erreur lors d'un test de configuration à l'aide de ceci.

Veuillez me faire savoir si vous voyez le contraire.

jaseeey
la source
Je vois nginx: [Emerg] variable "dir" inconnue
Alex Barker
Cette fausse vérification ne fonctionne plus, veuillez utiliser$foo ~ "^$"
Valdrinium
1

Le comportement semble avoir changé ou au moins être différent pour les valeurs des paramètres de requête utilisant $arg_<name>. Sur nginx 1.13.6, utilisez ce qui suit pour vérifier si une valeur de requête dans la variable ngx existe:

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

ne passe pas au 404. Utilisation:

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

renvoie un 404, si le paramètre de requête n'existe pas. Utile pour ne pas frapper en amont si un paramètre de requête requis n'existe pas.

timbo
la source
0

Une option simple, si vous définissez éventuellement la variable dans un fichier inclus, consiste simplement à définir d'abord la valeur par défaut.

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

La deuxième instruction set dans le fichier conf remplacera la valeur par défaut.

Sam Bull
la source