ブログ | NGINX

NGINX および NGINX Plus 用の正規表現テスター

NGINX-F5 水平黒タイプ RGB の一部
リック・ネルソン サムネイル
リック・ネルソン
2019年6月11日公開

NGINX で使用する正規表現 (regex) に取り組んでいるときに、実際の NGINX 構成内から regex を簡単にテストする方法を思いつきました。 (正規表現テスターはNGINX Open SourceNGINX Plusで同じように動作しますが、読みやすくするために、この投稿では単にNGINXと呼びます。)

正規表現のサポートは NGINX の強力な機能の 1 つですが、正規表現は複雑で、特に定期的に使用しない場合は正しく理解するのが難しい場合があります。 NGINX では、場所、マップ、書き換え、サーバー名など、構成の複数の部分で正規表現を使用できます。 ここで説明するテスターは、場所とマップ内の正規表現用です。

ほとんどの正規表現に適した無料のオンライン正規表現テスターは他にもありますが、NGINX は Web アプリケーション用に最適化された非標準のショートカットをいくつか使用します。 たとえば、標準の正規表現のように、URI 内のスラッシュ (/) をエスケープする必要はありません。 また、マップ内で正規表現を使用する場合は、一致に基づいて設定する値を指定します。 他の正規表現テスターでは、正規表現を変更したり、マップの場合は、どのような値が設定されるかを推測したりする必要があるかもしれません。 さらに、実際の環境で実際の正規表現エンジンを使用して正規表現をテストできることは常に良いことです。

注:

  • NGINX はPerl 互換正規表現(PCRE) を使用します。この投稿では、NGINX と正規表現の両方の基本的な理解を前提としています。 正規表現の構築方法の説明はこの記事の範囲外であり、その方法についてコメント セクションでさらに質問があっても回答できないことをお詫び申し上げます。

    正規表現を構築するためのツールやドキュメントを提供する Web サイトは数多くあります。 私たちが役に立つと感じた 2 つは次のとおりです。

  • テスターは、 map{}ブロックと HTTP location{}ブロックの 2 つのコンテキストで正規表現を処理します。以下では、それぞれのケースで正規表現がどのように機能するかについて簡単に説明します。 NGINX があらゆるコンテキストで正規表現をどのように処理するかを説明することは、この記事の範囲外です。次のドキュメントを参照してください。

  • テスターは、意図的に可能な限りシンプルに設計されており、マップと HTTP ロケーションに実際の NGINX 正規表現エンジンを使用して、ユーザーが記述した正規表現をテストするという 1 つの目的を達成します。 その結果、機能する NGINX 構成を作成するには、最小限の情報のみを提供する必要があります。シンプルさという基本原則に反するため、機能 (テスト前に正規表現を検証するなど) を追加する予定はありません。 もちろん、バグの修正は喜んで行いますので、 GitHub リポジトリIssuesタブにバグを報告してください。

概要

正規表現テスターの詳細に入る前に、まず 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 つのページでは、ユーザーに異なる入力を求めます。

  • ロケーションページ:

    • 正規表現
    • 大文字と小文字の区別
    • URI
  • マップページ:

    • 正規表現
    • 大文字と小文字の区別
    • テストする値(マップディレクティブの最初のパラメータである変数の値)
    • マップディレクティブの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 コンテンツにリダイレクトされます。"