nginx変数が設定されているかどうかをテストします


14

変数がまだ設定されていない場合は、変数をデフォルト値に設定する必要があります。次の設定は仕事をします:

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

ただし、ランタイム警告が生成されます。

初期化されていない「foo」変数を使用する

警告を生成せずに、グローバルに警告をオフにせずに変数が設定されているかどうかをテストする方法はありますか?

uninitialized_variable_warn off;


2
同様の何かを探しているときにこれを見つけましたがuninitialized_variable_warn、グローバルに設定する必要はないようです。初期化されていない可能性のある変数を使用する必要がある場所に設定するだけです。SSLの詳細をPHPに渡すためにこれを使用していますが、SSLなしでページにアクセスすると空になります。
ハラヴィック

@Haravikkそれはそうではないようですnginx: [emerg] "uninitialized_variable_warn" directive is duplicate in
-n1te

まだ別の場所に設定していますか?私は、PHPをサポートする場所によってのみインポートさuninitialized_variable_warnれるの一部として使用しているphp.confので、他のすべての場所に警告を残しながら、それらのスコープ内でのみそれを使用しています。uninitialized_variable_warnただし、他のスコープには設定していません(デフォルトのままにしますtrue)。
-Haravikk

回答:


11

変数が存在するかどうかを確認するために次を使用しています:

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

このロケーションブロックに到達する前に設定されていない場合は、空の文字列に設定されます。引用符の間に文字列を簡単に追加できます。これを使用して構成テストを実行しても、エラーは発生しません。

そうでない場合はお知らせください。


nginxが表示されています:[emerg] unknown "dir"変数
アレックスバーカー

この誤チェックはもう機能しません。使用してください$foo ~ "^$"
Valdrinium

1

を使用してクエリパラメータ値の動作が変更されたか、少なくとも異なっているよう$arg_<name>です。nginx 1.13.6では、次を使用してngx変数にクエリ値が存在するかどうかを確認します。

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

404に渡されません。使用方法:

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

クエリパラメータが存在しない場合、404を返します。必要なクエリパラメータが存在しない場合、アップストリームにヒットしないのに役立ちます。



0

簡単なオプションは、オプションでインクルードファイルの変数を設定する場合、単にデフォルト値を最初に設定することです。

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

confファイルの2番目のsetステートメントは、デフォルト値を置き換えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.