¿Cómo usar una variable en una expresión regular en nginx?

¿Cómo usar una variable en una expresión regular en nginx?

Pasé algún tiempo tratando de encontrar la respuesta antes de escribir esta pregunta:

Tengo varios locationbloques en mi archivo de configuración de nginx que se ven así:

location ~ ^/(doc|img|bla|foo)/metadata/$ { ... }

location ~ ^/(doc|img|bla|foo)/deleted/$ { ... }

location ~ ^/(doc|img|bla|foo)/something/$ { ... }

Entonces pensé que sería una buena idea refactorizar la expresión regular repetida en una variable que configuré en la serversección (también porque sé que tendré que agregarle más en el futuro), así:

server {
     set $my_regex doc|img|blah|foo;

     # I also tried this one:
     set $my_regex "doc|img|blah|foo";
     ....
}

Que luego reutilizaría dentro de los bloques de ubicación:

# this doesn't have any effect
location ~ ^/($my_regex)/metadata/$ { ... }

# this one neither
location ~ ^/(\$my_regex)/deleted/$ { ... }

# and this one neither
location ~ ^/(${my_regex})/something/$ { ... }

¿Alguna idea? ¡Gracias!

Respuesta1

No hay forma de utilizar variables en locationla comparación.

Si lo deseas, probablemente estés haciendo algo mal. En este caso, podría probar con ubicaciones de anidación.

Respuesta2

Por favor revisa estoenlacecomo dijeron en NGINXdocumentación

The PCRE library supports named captures using the following syntax:

?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name>    Python compatible syntax, supported since PCRE-4.0

Las capturas con nombre son una característica de PCRE y tienen diferentes sintaxis disponibles en diferentes versiones. ¿Para la sintaxis que utilizas? debes tener PCRE 7.0 al menos.

información relacionada