BLOG | NGINX

Un comprobador de expresiones regulares para NGINX y NGINX Plus

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Rick Nelson
Rick Nelson
Publicado el 11 de junio de 2019

Mientras trabajaba en una expresión regular (regex) para usar con NGINX, se me ocurrió una forma de probar fácilmente una expresión regular desde dentro de una configuración real de NGINX. (El comprobador de expresiones regulares funciona de la misma manera para NGINX Open Source y NGINX Plus , y para facilitar la lectura me referiré simplemente a NGINX en esta publicación).

El soporte para expresiones regulares es una de las características poderosas de NGINX, pero las expresiones regulares pueden ser complejas y difíciles de usar correctamente, especialmente si no trabajas con ellas regularmente. NGINX permite expresiones regulares en múltiples partes de una configuración, por ejemplo, ubicaciones, mapas, reescrituras y nombres de servidores. El probador descrito aquí es para expresiones regulares en ubicaciones y mapas.

Hay otros probadores de expresiones regulares gratuitos en línea que son buenos para la mayoría de las expresiones regulares, pero NGINX usa algunos atajos no estándar optimizados para aplicações web. Por ejemplo, no es necesario escapar la barra diagonal (/) en una URI como lo haces en una expresión regular estándar. Además, al usar una expresión regular en un mapa, se especifica qué valor establecer en función de una coincidencia. Con otros comprobadores de expresiones regulares es posible que tengas que modificar la expresión regular o, en el caso de un mapa, inferir qué valor se establecerá. Además, siempre es bueno 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 esta publicación supone una comprensión básica tanto de NGINX como de expresiones regulares. Explicar cómo construir expresiones regulares está fuera del alcance de esta publicación y lamentamos no poder responder más preguntas en la sección de comentarios sobre cómo hacerlo.

    Hay numerosos sitios web que proporcionan herramientas o documentación para crear expresiones regulares. Dos que nos han resultado útiles son:

  • El probador maneja expresiones regulares en dos contextos: bloques map{} y bloques HTTP location{} ; a continuación hay una breve discusión sobre cómo funcionan las expresiones regulares en cada caso. Explicar cómo NGINX maneja las expresiones regulares en todos los contextos está fuera del alcance de esta publicación; consulte nuestra documentación:

  • El probador está diseñado intencionalmente para ser lo más simple posible y para cumplir un propósito: probar expresiones regulares tal como las escribe el usuario, utilizando el motor de expresiones regulares NGINX real para mapas y ubicaciones HTTP. Por lo tanto, solo necesita proporcionar una cantidad mínima de información para crear una configuración NGINX funcional. No tenemos previsto añadir funciones (como validar la expresión regular antes de las pruebas), ya que ello violaría el principio rector de la simplicidad. Estaremos encantados de corregir errores, por supuesto; envíelos a la pestaña Problemas en nuestro repositorio de GitHub .

INFORMACIÓN GENERAL

Antes de entrar en los detalles del probador de expresiones regulares, analicemos primero cómo se pueden usar las expresiones regulares en ubicaciones y mapas de NGINX.

Ubicaciones

Las expresiones regulares en los bloques location{} de NGINX tienen el formato:

expresión regular de ubicación { #... }

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

ubicación ~* /myapp/.+\.php$ {
#...
}

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

ubicación ~* (.*/myapp)/(.+\.php)$ {
#...
}

Para la 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:

ubicación ~* (?<inicio>.*miapp)/(?<fin>.+\.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 los trata como grupos de captura posicionales en su salida, mostrando sus números ordinales en lugar de sus nombres.

Mapas

Los bloques map{} de NGINX que utilizan expresiones regulares tienen el formato:

mapa variable-a-prueba variable-a-conjunto { regex1 valor-a-conjunto-si-coincide ; regex2 valor-a-conjunto-si-coincide ; #... regexN valor-a-conjunto-si-coincide ; valor-a-conjunto-si-no-coincide ; }

Por ejemplo, este bloque map{} establece la variable $isphp en1 si la URI (tal como está registrada en la variable $uri ) termina en .php , y0 Si no es así (la coincidencia distingue entre mayúsculas y minúsculas):

mapa $uri $isphp {
~\.php$ 1;
predeterminado 0;
}

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

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

mapa $uri $extarchivo {
    ~*.+\.(.+)$ $1;
    por defecto      '';
}

Y como $ext en este ejemplo:

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

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

El comprobador de expresiones regulares

El probador de expresiones regulares se implementa 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 la otra para expresiones regulares en bloques map{} . Las dos páginas solicitan al usuario diferentes entradas:

  • Página de ubicación:

    • La expresión regular
    • Sensibilidad a mayúsculas y minúsculas
    • La URI
  • Página del mapa:

    • La expresión regular
    • Sensibilidad a mayúsculas y minúsculas
    • El valor a probar (el valor de la variable que es el primer parámetro de la directiva de mapa )
    • El valor que se establecerá en la variable especificada como segundo parámetro de la directiva de mapa

Después de proporcionar la información, haga clic en el botón Probar . El probador genera el archivo de configuración NGINX necesario, se vuelve a cargar la configuración y se envía una solicitud para probar la expresión regular. Luego se muestran los resultados e indican si se encontró una coincidencia. Si es así, en la página Probador de ubicación se muestran los valores de los grupos de captura y en la página Probador de mapas se informa el valor establecido por el mapa.

Ejemplo de página de ubicación

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

 

Ejemplo de página de mapa

Este ejemplo muestra los resultados de una prueba que no distingue entre mayúsculas y minúsculas de la expresión regular. .+\.(?<ext>.*)$ contra el valor /miapp/hola.php, con el grupo de captura nombrado $ext como valor a establecer:

 

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

CONCLUSIÓN

Puedes ver que la configuración de NGINX es bastante corta y simple. El trabajo duro lo realiza la página PHP que genera el archivo de configuración NGINX necesario en función de los valores ingresados por el usuario, recarga NGINX, envía una solicitud a NGINX y muestra los resultados.

Puedes probar el comprobador de expresiones regulares tú mismo: 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 funcionamiento del comprobador de expresiones regulares, se incluyen todos los archivos necesarios. Para crear la imagen de Docker y el contenedor, simplemente ejecute:

$ docker-compose up -d

Luego, apunte su navegador a http:// Docker-host /regextester.php .

Espero que el probador le resulte útil al utilizar expresiones regulares y que le permita vislumbrar algo del poder, la flexibilidad y la simplicidad de NGINX.

Para probar el probador de expresiones regulares con NGINX Plus, comience hoy su prueba gratuita de 30 días o contáctenos para analizar sus casos de uso .


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.