Un comprobador de expresiones regulares para NGINX y NGINX Plus

NGINX | 11 de junio de 2019

Mientras trabajaba en una expresión regular (regex) para usarla con NGINX, se me ocurrió una forma de probar fácilmente una expresión regular desde una configuración real de NGINX. (El comprobador de expresiones regulares funciona exactamente igual con NGINX Open Source y NGINX Plus, y para facilitar la lectura, en este artículo me referiré a ambos simplemente como NGINX).

La compatibilidad con expresiones regulares es una de las potentes funciones de NGINX, pero estas expresiones pueden ser complejas y difíciles de configurar correctamente, sobre todo si no se trabaja con ellas habitualmente. NGINX permite usar expresiones regulares en varias partes de una configuración, por ejemplo, en ubicaciones, mapas, reescrituras y nombres de servidor. La herramienta de prueba que se describe aquí está destinada a las expresiones regulares utilizadas en ubicaciones y mapas.

Existen otros comprobadores de expresiones regulares gratuitos en línea que funcionan bien para la mayoría de las expresiones, pero NGINX utiliza algunos atajos no estándar optimizados para aplicaciones web. Por ejemplo, no es necesario escapar la barra inclinada (/) de un URI como se haría en una expresión regular estándar. Además, al utilizar una expresión regular en un mapa, se especifica el valor que se debe establecer cuando haya una coincidencia. Con otros comprobadores de expresiones regulares, puede que sea necesario modificar la expresión o, en el caso de un mapa, deducir qué valor se establecerá. Asimismo, siempre es conveniente poder probar una expresión regular con el motor de expresiones regulares real en el entorno real.

Notas:

  • NGINX utiliza expresiones regulares compatibles con Perl (PCRE), y este artículo presupone unos conocimientos básicos tanto de NGINX como de las expresiones regulares. Explicar cómo crear expresiones regulares queda fuera del alcance de este artículo y, lamentablemente, no podemos responder en la sección de comentarios a más preguntas sobre cómo hacerlo. Existen numerosos sitios web que ofrecen herramientas o documentación para crear expresiones regulares. Dos que nos han resultado útiles son:
  • El comprobador gestiona las expresiones regulares en dos contextos: los bloques map{} y los bloques HTTP location{}. A continuación, se explica brevemente cómo funcionan las expresiones regulares en cada caso. Explicar cómo gestiona NGINX las expresiones regulares en todos los contextos queda fuera del alcance de esta publicación; consulte nuestra documentación:
  • El comprobador se ha diseñado deliberadamente para que sea lo más sencillo posible y cumpla un único propósito: probar las expresiones regulares tal como las escribe el usuario, utilizando el motor de expresiones regulares real de NGINX para mapas y ubicaciones HTTP. Por tanto, solo es necesario proporcionar una cantidad mínima de información para crear una configuración de NGINX funcional. No tenemos previsto añadir funciones (como validar la expresión regular antes de probarla), ya que eso contravendría el principio rector de simplicidad. Por supuesto, estaremos encantados de corregir errores; notifíquelos en la pestaña Issues de nuestro repositorio de GitHub.

Descripción general

Antes de entrar en los detalles del comprobador de expresiones regulares, veamos primero cómo se pueden utilizar estas expresiones en las ubicaciones y los mapas de NGINX.

Ubicaciones

Las expresiones regulares en los bloques location{} de NGINX tienen la siguiente forma:

location regex {
    #...
}

Por ejemplo, un bloque location{} con la siguiente expresión regular gestiona todas las solicitudes PHP cuya URI termina en myapp/nombre_de_archivo.php, como /test/myapp/hello.php y /myapp/hello.php. El asterisco después de la virgulilla (~*) hace que la coincidencia no distinga entre mayúsculas y minúsculas.

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

NGINX y el comprobador de expresiones regulares admiten grupos de captura posicionales en los bloques location{}. En el siguiente ejemplo, el primer grupo captura todo lo que aparece antes del nombre del archivo PHP y el segundo captura el nombre del archivo PHP:

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

Para el URI /myapp/hello.php, la variable $1 se establece en /myapp y $2 se establece en hello.php.

NGINX también admite grupos de captura con nombre:

location ~* (?<begin>.*myapp)/(?<end>.+\.php)$ {
    #...
}

En este caso, la variable $begin se establece en /myapp y $end se establece en hello.php.

El comprobador de expresiones regulares admite grupos de captura con nombre, pero en los resultados los trata como grupos de captura posicionales y muestra sus números ordinales en lugar de sus nombres.

Mapas

Los bloques map{} de NGINX que utilizan expresiones regulares tienen la siguiente forma:

map variable-to-test variable-to-set {
    regex1 value-to-set-if-match;
    regex2 value-to-set-if-match;
    #...
    regexN value-to-set-if-match;
    default value-to-set-if-no-match;
}

Por ejemplo, este bloque map{} asigna a la variable $isphp el valor 1 si el URI (tal como se registra en la variable $uri) termina en .php, y el valor 0 si no es así (la coincidencia distingue entre mayúsculas y minúsculas):

map $uri $isphp {
    ~\.php$ 1;
    default 0;
}

En los mapas, tanto NGINX como el comprobador de expresiones regulares admiten grupos de captura posicionales y con nombre.

Por ejemplo, los dos mapas siguientes asignan a la variable $fileext el valor de la extensión del archivo, que en este ejemplo también se captura como $1:

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

Y como $ext en este ejemplo:

map $uri $fileext {
    ~*.+\.(?<ext>.+)$  $ext;
    default            '';
}

Puede utilizar el comprobador de expresiones regulares para los bloques map{} tanto en el contexto http{} como en el contexto stream{}, ya que la sintaxis y el comportamiento de los mapas son los mismos en ambos contextos. Sin embargo, tenga en cuenta que, si el mapa se encuentra en el contexto stream{}, solo puede utilizar el bloque map{} de la salida del comprobador. Consulte la nota que aparece a continuación para obtener más información.

El comprobador de expresiones regulares

El comprobador de expresiones regulares está implementado en un contenedor Docker con NGINX y NGINX Unit instalados. NGINX Unit ofrece dos variantes de una página PHP: una para expresiones regulares en bloques location{} y otra para expresiones regulares en bloques map{}. Las dos páginas solicitan al usuario datos diferentes:

  • Página de ubicación:
    • La expresión regular
    • Distinción entre mayúsculas y minúsculas
    • El URI
  • Página del mapa:
    • La expresión regular
    • Distinción entre mayúsculas y minúsculas
    • El valor que se va a comprobar (el valor de la variable que es el primer parámetro de la directiva map)
    • El valor que se asignará a la variable especificada como segundo parámetro de la directiva map directive

Después de proporcionar la información, haga clic en el botón «Probar». La herramienta de prueba genera el archivo de configuración de NGINX necesario, se vuelve a cargar la configuración y se envía una solicitud para probar la expresión regular. A continuación, se muestran los resultados, que indican si se ha encontrado una coincidencia. En caso afirmativo, en la página «Probador de ubicaciones» se muestran los valores de los grupos de captura y, en la página «Probador de mapas», se indica el valor establecido por el mapa.

Ejemplo de la página Location

Este ejemplo muestra los resultados de una prueba sin distinguir entre mayúsculas y minúsculas de la expresión regular (.*myapp)/(.+\.php)$ con el URI /myapp/hello.php:

Ejemplo de página de mapa

Este ejemplo muestra los resultados de una prueba sin distinción entre mayúsculas y minúsculas de la expresión regular .+\.(?<ext>.*)$ con el valor /myapp/hello.php, utilizando el grupo de captura con nombre $ext como valor que se va a establecer:

Nota: Si su mapa se encuentra en el contexto stream{} solo puede utilizar en su configuración el bloque map{} de la salida. El bloque server{} no es válido porque incluye un bloque location{} que no es compatible con el contexto stream{}.

Conclusión

Como puede ver, la configuración de NGINX es bastante breve y sencilla. El trabajo más complejo lo realiza la página PHP, que genera el archivo de configuración de NGINX necesario a partir de los valores introducidos por el usuario, vuelve a cargar NGINX, envía una solicitud a NGINX y muestra los resultados.

Puede probar usted mismo el comprobador de expresiones regulares: todo el código está disponible en nuestro repositorio de GitHub (https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-regex-tester).

Para facilitar la puesta en marcha del comprobador de expresiones regulares, se incluyen todos los archivos necesarios. Para crear la imagen de Docker y el contenedor, basta con ejecutar:

$ docker-compose up -d

A continuación, accede desde tu navegador a http://Docker-host/regextester.php.

Espero que el probador te resulte útil al trabajar con expresiones regulares y que te permita vislumbrar parte de la potencia, flexibilidad y sencillez de NGINX.

Para probar el comprobador de expresiones regulares con NGINX Plus, inicia hoy mismo tu prueba gratuita de 30 días o ponte en contacto con nosotros para hablar sobre tus casos de uso.


Compartir
Etiquetas: F5 NGINX, Tech, 2019

Sobre el autor

Rick Nelson
Rick NelsonVicepresidente regional de Ingeniería de Soluciones

Más artículos de Rick Nelson

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.