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:
Controles de salud:
location{}
– Guía de administración de nginx.org y NGINX Plusmap{}
– nginx.orgAntes 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.
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.
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 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:
Página del mapa:
de mapa
)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.
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 :
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{}
.
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.