Teste se a variável nginx está configurada

14

Preciso definir uma variável para um valor padrão, se ainda não estiver definida. A seguinte configuração faz o trabalho:

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

Mas gera avisos de tempo de execução:

usando variável "foo" não inicializada

Existe uma maneira de testar se uma variável é definida sem gerar o aviso e sem desativar o aviso globalmente com:

uninitialized_variable_warn off;
Jan Wrobel
fonte
tente set_if_emptyem github.com/openresty/set-misc-nginx-module
SaveTheRbtz 2/15/15
2
Acabei de descobrir isso enquanto procurava algo semelhante, mas parece uninitialized_variable_warnque não precisa ser definido globalmente, você pode defini-lo onde precisa usar variáveis ​​potencialmente não inicializadas. Estou usando isso para passar detalhes de SSL para PHP, que estarão vazios se a página for acessada sem SSL.
Haravikk
@Haravikk parece que não é o casonginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
n1te
Você ainda o colocou em outro lugar? Estou usando uninitialized_variable_warncomo parte de um php.confque é importado apenas por locais que suportam PHP, então definitivamente estou usando-o apenas nesses escopos, deixando o aviso em qualquer outro lugar. Eu ainda não uninitialized_variable_warndefini nenhum outro escopo (deixando como padrão true).
Haravikk

Respostas:

11

Estou usando o seguinte para verificar se existe uma variável:

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

Se não estiver definido antes de atingir esse bloco de local, será definido como uma sequência em branco. Você pode facilmente adicionar uma string entre as aspas. Não recebo nenhum erro ao fazer um teste de configuração usando isso.

Entre em contato se você estiver vendo o contrário.

jaseeey
fonte
Estou vendo nginx: [emerg] desconhecido "dir" variável
Alex Barker
Esta falsa verificação não funciona mais, por favor use$foo ~ "^$"
Valdrinium
1

O comportamento parece ter sido alterado ou pelo menos diferente para os valores dos parâmetros de consulta usando $arg_<name>. No nginx 1.13.6, use o seguinte para verificar se existe um valor de consulta na variável ngx:

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

não passa para o 404. Usando:

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

retorna 404, se o parâmetro de consulta não existir. Útil para não atingir o upstream se um parâmetro de consulta necessário não existir.

timbo
fonte
0

Uma opção fácil, se você estiver configurando a variável em um arquivo incluído, é simplesmente definir o valor padrão primeiro.

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

A segunda instrução set no arquivo conf substituirá o valor padrão.

Sam Bull
fonte