Test if nginx variable is set

I need to set a variable to a default value if it is not already set. Following config does the job:

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

But it generates runtime warnings:

using uninitialized "foo" variable

Is there a way to test if a variable is set without generating the warning and without turning off the warning globally with:

uninitialized_variable_warn off;

I'm using the following to check if a variable exists:

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

If it's not set before it reaches this location block, then it will set it to a blank string. You can just as easily add a string between the quotes. I do not get any errors when doing a configuration test using this.

Please let me know if you're seeing otherwise.


The behaviour seems to have changed or at least be different for query parameter values using $arg_<name>. On nginx 1.13.6, using the following to check if a query value in the ngx variable exists:

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

does not pass to the 404. Using:

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

returns a 404, if the query parameter does not exist. Useful for not hitting upstream if a required query parameter does not exist.