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;


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.


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.



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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.