NGINX で使用する正規表現 (regex) に取り組んでいるときに、実際の NGINX 構成内から regex を簡単にテストする方法を思いつきました。 (正規表現テスターはNGINX Open SourceとNGINX Plusで同じように動作しますが、読みやすくするために、この投稿では単にNGINXと呼びます。)
正規表現のサポートは NGINX の強力な機能の 1 つですが、正規表現は複雑で、特に定期的に使用しない場合は正しく理解するのが難しい場合があります。 NGINX では、場所、マップ、書き換え、サーバー名など、構成の複数の部分で正規表現を使用できます。 ここで説明するテスターは、場所とマップ内の正規表現用です。
ほとんどの正規表現に適した無料のオンライン正規表現テスターは他にもありますが、NGINX は Web アプリケーション用に最適化された非標準のショートカットをいくつか使用します。 たとえば、標準の正規表現のように、URI 内のスラッシュ (/) をエスケープする必要はありません。 また、マップ内で正規表現を使用する場合は、一致に基づいて設定する値を指定します。 他の正規表現テスターでは、正規表現を変更したり、マップの場合は、どのような値が設定されるかを推測したりする必要があるかもしれません。 さらに、実際の環境で実際の正規表現エンジンを使用して正規表現をテストできることは常に良いことです。
注:
NGINX はPerl 互換正規表現(PCRE) を使用します。この投稿では、NGINX と正規表現の両方の基本的な理解を前提としています。 正規表現の構築方法の説明はこの記事の範囲外であり、その方法についてコメント セクションでさらに質問があっても回答できないことをお詫び申し上げます。
正規表現を構築するためのツールやドキュメントを提供する Web サイトは数多くあります。 私たちが役に立つと感じた 2 つは次のとおりです。
テスターは、 map{}
ブロックと HTTP location{}
ブロックの 2 つのコンテキストで正規表現を処理します。以下では、それぞれのケースで正規表現がどのように機能するかについて簡単に説明します。 NGINX があらゆるコンテキストで正規表現をどのように処理するかを説明することは、この記事の範囲外です。次のドキュメントを参照してください。
ヘルスチェック:
location{}
ブロック – nginx.orgおよびNGINX Plus 管理者ガイドmap{}
ブロック – nginx.org正規表現テスターの詳細に入る前に、まず NGINX の場所とマップで正規表現がどのように使用されるかについて説明しましょう。
NGINX location{}
ブロック内の正規表現の形式は次のとおりです。
場所の正規表現{ #... }
たとえば、次の正規表現を含むlocation{}
ブロックは、 /test/myapp/hello.phpや/myapp/hello.phpなど、 myapp/ filename .phpで終わる URI を持つすべての PHP リクエストを処理します。 チルダの後のアスタリスク ( ~*
) により、大文字と小文字は区別されずに一致します。
場所 ~* /myapp/.+\.php$ {
#...
}
NGINX と正規表現テスターは、 location{}
ブロック内の位置キャプチャ グループをサポートします。 次の例では、最初のグループは PHP ファイル名より前のすべてをキャプチャし、2 番目のグループは PHP ファイル名をキャプチャします。
場所 ~* (.*/myapp)/(.+\.php)$ {
#...
}
URI /myapp/hello.phpの場合、変数$1
は/myapp
に設定され、 $2 は
hello.php
に設定されます。
NGINX は名前付きキャプチャ グループもサポートします。
場所 ~* (?<begin>.*myapp)/(?<end>.+\.php)$ {
#...
}
この場合、変数$begin は
/myapp
に設定され、 $end は
hello.php
に設定されます。
正規表現テスターは名前付きキャプチャ グループをサポートしますが、出力ではそれらを位置キャプチャ グループのように扱い、名前ではなく序数を表示します。
正規表現を使用する NGINX map{}
ブロックの形式は次のとおりです。
テストする変数、設定する変数をマップします { regex1 一致する場合に設定する値; regex2 一致する場合に設定する値; #... regexN 一致する場合に設定する値;一致しない場合に設定するデフォルト値; }
たとえば、このmap{}
ブロックは変数$isphpを
次のように設定します。1
URI( $uri
変数に記録されている)が.phpで終わっており、0
そうでない場合(一致は大文字と小文字を区別します):
$uri $isphp をマップします {
~\.php$ 1;
デフォルト 0;
}
マップの場合、NGINX と正規表現テスターは位置キャプチャ グループと名前付きキャプチャ グループの両方をサポートします。
たとえば、次のマップは両方とも変数$fileext を
ファイル拡張子の値に設定し、この例では$1
としてキャプチャされます。
マップ $uri $fileext { ~*.+\.(.+)$ $1;
デフォルト '';
}
この例では$ext
として次のようになります。
$uri $fileext をマップします {
~*.+\.(?<ext>.+)$ $ext;
デフォルト '';
}
マップの構文と動作は両方のコンテキストで同じであるため、 http{} コンテキスト
とstream{}
コンテキストの両方でmap{}
ブロックに正規表現テスターを使用できます。 ただし、マップがstream{}
コンテキスト内にある場合は、テスターの出力からのmap{}
ブロックのみを使用できることに注意してください。 詳細については下記の注記を参照してください。
正規表現テスターは、NGINX とNGINX Unitがインストールされた Docker コンテナーに実装されています。 NGINX Unit は、PHP ページの 2 つのバリエーションを提供します。1 つはlocation{}
ブロック内の正規表現用、もう 1 つはmap{}
ブロック内の正規表現用です。 2 つのページでは、ユーザーに異なる入力を求めます。
ロケーションページ:
マップページ:
マップ
ディレクティブの最初のパラメータである変数の値)マップ
ディレクティブの2番目のパラメータとして指定された変数に設定する値情報を入力したら、 「テスト」ボタンをクリックします。 テスターは必要な NGINX 構成ファイルを生成し、構成が再ロードされ、正規表現をテストするためのリクエストが送信されます。 結果が表示され、一致が見つかったかどうかが示されます。 その場合、ロケーション テスターページにキャプチャ グループの値が表示され、マップ テスターページにはマップによって設定された値が報告されます。
この例では、URI /myapp/hello.phpに対して正規表現(.*myapp)/(.+\.php)$ を
大文字と小文字を区別せずにテストした結果を示しています。
この例では、大文字と小文字を区別しない正規表現のテストの結果を示しています。 .+\.(?<拡張子>.*)$
価値に対して php は、、名前付きキャプチャグループ $拡張子
設定する値として:
注記: マップがstream{}
コンテキスト内にある場合は、構成の出力からmap{}
ブロックのみを使用できます。 server{}
ブロックには、 stream{}
コンテキストでサポートされていないlocation{}
ブロックが含まれているため、無効です。
NGINX の設定は非常に短くシンプルであることがわかります。 大変な作業は、ユーザーが入力した値に基づいて必要な NGINX 構成ファイルを生成し、NGINX をリロードし、NGINX にリクエストを送信し、結果を表示する PHP ページによって実行されます。
正規表現テスターを自分で試すことができます。すべてのコードはGitHub リポジトリ( https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester ) で入手できます。
正規表現テスターを簡単に起動して実行できるように、必要なファイルがすべて含まれています。 Docker イメージをビルドしてコンテナをビルドするには、次のコマンドを実行するだけです。
$ docker-compose アップ -d
次に、ブラウザでhttp:// Docker-host /regextester.phpにアクセスします。
正規表現を使用する際にテスターが役立ち、NGINX のパワー、柔軟性、シンプルさの一端を垣間見ることができることを願っています。
NGINX Plus で正規表現テスターを試すには、今すぐ30 日間の無料トライアルを開始するか、お問い合わせの上、使用事例についてご相談ください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"