BLOG | NGINX

Un testeur d'expressions régulières pour NGINX et NGINX Plus

NGINX-Partie-de-F5-horiz-black-type-RGB
Vignette de Rick Nelson
Rick Nelson
Publié le 11 juin 2019

Alors que je travaillais sur une expression régulière (regex) à utiliser avec NGINX, j'ai eu l'idée d'un moyen de tester facilement une expression régulière à partir d'une configuration NGINX réelle. (Le testeur regex fonctionne de la même manière pour NGINX Open Source et NGINX Plus , et pour faciliter la lecture, je ferai simplement référence à NGINX dans cet article.)

La prise en charge des expressions régulières est l’une des fonctionnalités puissantes de NGINX, mais les expressions régulières peuvent être complexes et difficiles à maîtriser, surtout si vous ne travaillez pas avec elles régulièrement. NGINX autorise les expressions régulières dans plusieurs parties d'une configuration, par exemple les emplacements, les cartes, les réécritures et les noms de serveur. Le testeur décrit ici est destiné aux expressions régulières dans les emplacements et les cartes.

Il existe d’autres testeurs d’expressions régulières en ligne gratuits qui conviennent à la plupart des expressions régulières, mais NGINX utilise des raccourcis non standard optimisés pour les applications Web. Par exemple, vous n’avez pas besoin d’échapper la barre oblique (/) dans un URI comme vous le faites dans une expression régulière standard. De plus, lorsque vous utilisez une expression régulière dans une carte, vous spécifiez la valeur à définir en fonction d'une correspondance. Avec d'autres testeurs d'expressions régulières, vous devrez peut-être modifier l'expression régulière ou, dans le cas d'une carte, déduire quelle valeur sera définie. De plus, il est toujours bon de pouvoir tester une expression régulière avec le moteur d'expression régulière réel dans l'environnement réel.

Remarques :

  • NGINX utilise des expressions régulières compatibles Perl (PCRE), et cet article suppose une compréhension de base de NGINX et des expressions régulières. Expliquer comment construire des expressions régulières dépasse le cadre de cet article, et nous regrettons de ne pouvoir répondre à d'autres questions dans la section commentaires sur la façon de procéder.

    Il existe de nombreux sites Web qui fournissent des outils ou de la documentation pour créer des expressions régulières. Deux d'entre eux que nous avons trouvés utiles sont :

  • Le testeur gère les expressions régulières dans deux contextes – les blocs map{} et les blocs HTTP location{} – et ci-dessous, vous trouverez une brève discussion sur le fonctionnement des expressions régulières dans chaque cas. Expliquer comment NGINX gère les expressions régulières dans tous les contextes dépasse le cadre de cet article ; consultez notre documentation :

  • Le testeur est intentionnellement conçu pour être aussi simple que possible et pour remplir un objectif : tester les expressions régulières telles qu'écrites par l'utilisateur, en utilisant le moteur d'expressions régulières NGINX réel pour les cartes et les emplacements HTTP. Par conséquent, vous n'avez besoin de fournir qu'une quantité minimale d'informations pour créer une configuration NGINX fonctionnelle. Nous n'avons pas prévu d'ajouter de fonctionnalités (comme la validation de l'expression régulière avant le test), car cela violerait le principe directeur de simplicité. Nous sommes bien sûr heureux de corriger les bugs ; veuillez les soumettre dans l'onglet Problèmes de notre dépôt GitHub .

Aperçu

Avant d’entrer dans les détails du testeur d’expressions régulières, discutons d’abord de la manière dont les expressions régulières peuvent être utilisées dans les emplacements et les cartes NGINX.

Emplacements

Les expressions régulières dans les blocs NGINX location{} sont de la forme :

expression régulière de localisation { #... }

Par exemple, un bloc location{} avec l'expression régulière suivante gère toutes les requêtes PHP avec un URI se terminant par myapp/ filename .php , comme /test/myapp/hello.php et /myapp/hello.php . L'astérisque après le tilde ( ~* ) rend la correspondance insensible à la casse.

emplacement ~* /myapp/.+\.php$ {
#...
}

NGINX et le testeur regex prennent en charge les groupes de capture positionnelle dans les blocs location{} . Dans l'exemple suivant, le premier groupe capture tout ce qui se trouve avant le nom du fichier PHP et le second capture le nom du fichier PHP :

emplacement ~* (.*/myapp)/(.+\.php)$ {
#...
}

Pour l'URI /myapp/hello.php , la variable $1 est définie sur /myapp et $2 est définie sur hello.php .

NGINX prend également en charge les groupes de capture nommés :

emplacement ~* (?<début>.*monapplication)/(?<fin>.+\.php)$ {
#...
}

Dans ce cas, la variable $begin est définie sur /myapp et $end est définie sur hello.php .

Le testeur d'expressions régulières prend en charge les groupes de capture nommés mais les traite comme des groupes de capture positionnels dans sa sortie, en affichant leurs nombres ordinaux plutôt que leurs noms.

Cartes

Les blocs NGINX map{} qui utilisent des expressions régulières sont de la forme :

map variable-à-tester variable-à-définir { regex1 valeur-à-définir-si-correspondance ; regex2 valeur-à-définir-si-correspondance ; #... regexN valeur-à-définir-si-correspondance ; par défaut valeur-à-définir-si-pas-de-correspondance ; }

Par exemple, ce bloc map{} définit la variable $isphp sur1 si l'URI (tel qu'enregistré dans la variable $uri ) se termine par .php , et0 si ce n’est pas le cas (la correspondance est sensible à la casse) :

carte $uri $isphp {
~\.php$ 1;
par défaut 0;
}

Pour les cartes, NGINX et le testeur d'expressions régulières prennent en charge les groupes de capture positionnels et nommés.

Par exemple, les cartes suivantes définissent toutes deux la variable $fileext sur la valeur de l'extension de fichier, qui est également capturée comme $1 dans cet exemple :

map $uri $fileext { ~*.+\.(.+)$ $1;
    défaut      '';
}

Et comme $ext dans cet exemple :

carte $uri $fileext {
~*.+\.(?<ext>.+)$ $ext;
par défaut '';
}

Vous pouvez utiliser le testeur d'expressions régulières pour les blocs map{} dans les contextes http{} et stream{} , car la syntaxe et le comportement des cartes sont les mêmes dans les deux contextes. Notez cependant que si votre carte est dans le contexte stream{} , vous ne pouvez utiliser que le bloc map{} de la sortie du testeur. Voir la note ci-dessous pour plus de détails.

Le testeur d'expressions régulières

Le testeur regex est implémenté dans un conteneur Docker avec NGINX et NGINX Unit installés. NGINX Unit propose deux variantes d'une page PHP, une pour les expressions régulières dans les blocs location{} et l'autre pour les expressions régulières dans les blocs map{} . Les deux pages invitent l'utilisateur à effectuer différentes saisies :

  • Page de localisation :

    • L'expression régulière
    • Sensibilité à la casse
    • L'URI
  • Page de la carte:

    • L'expression régulière
    • Sensibilité à la casse
    • La valeur à tester (la valeur de la variable qui est le premier paramètre de la directive map )
    • La valeur à définir dans la variable spécifiée comme deuxième paramètre de la directive map

Après avoir fourni les informations, cliquez sur le bouton Test . Le testeur génère le fichier de configuration NGINX nécessaire, la configuration est rechargée et une demande est envoyée pour tester l'expression régulière. Les résultats sont ensuite affichés et indiquent si une correspondance a été trouvée. Si tel est le cas, sur la page Location Tester , les valeurs des groupes de capture sont affichées et sur la page Map Tester, la valeur définie par la carte est signalée.

Exemple de page de localisation

Cet exemple montre les résultats d'un test insensible à la casse de l'expression régulière (.*myapp)/(.+\.php)$ par rapport à l'URI /myapp/hello.php :

 

Exemple de page de carte

Cet exemple montre les résultats d'un test insensible à la casse de l'expression régulière .+\.(?<ext>.*)$ contre la valeur /monapplication/bonjour.php, avec le groupe de capture nommé $ext comme valeur à définir :

 

Note: Si votre carte est dans le contexte stream{} , vous ne pouvez utiliser que le bloc map{} de la sortie dans votre configuration. Le bloc server{} n'est pas valide car il inclut un bloc location{} , qui n'est pas pris en charge dans le contexte stream{} .

Conclusion

Vous pouvez voir que la configuration NGINX est assez courte et simple. Le travail le plus dur est effectué par la page PHP qui génère le fichier de configuration NGINX nécessaire en fonction des valeurs saisies par l'utilisateur, recharge NGINX, envoie une requête à NGINX et affiche les résultats.

Vous pouvez tester le testeur regex par vous-même : tout le code est disponible dans notre dépôt GitHub ( https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester ).

Pour faciliter la mise en place et le fonctionnement du testeur regex, tous les fichiers nécessaires sont inclus. Pour créer l’image Docker et construire le conteneur, exécutez simplement :

$ docker-compose up -d

Ensuite, pointez votre navigateur sur http:// Docker-host /regextester.php .

J'espère que vous trouverez le testeur utile lors de l'utilisation d'expressions régulières et qu'il vous donne un aperçu de la puissance, de la flexibilité et de la simplicité de NGINX.

Pour tester le testeur regex avec NGINX Plus, démarrez votre essai gratuit de 30 jours dès aujourd'hui ou contactez-nous pour discuter de vos cas d'utilisation .


« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."