Como usar uma variável em uma expressão regular no nginx?

Como usar uma variável em uma expressão regular no nginx?

Passei algum tempo tentando encontrar a resposta antes de escrever esta pergunta:

Eu tenho vários locationblocos em meu arquivo de configuração nginx parecidos com este:

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

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

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

Então pensei que seria uma boa ideia refatorar a expressão regular repetida em uma variável que defini na serverseção (também porque sei que terei que adicioná-la no futuro), assim:

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

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

Que eu reutilizaria dentro dos blocos de localização:

# 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/$ { ... }

Qualquer ideia? Obrigado!

Responder1

Não há como usar variáveis ​​na locationcorrespondência.

Se você quiser, provavelmente está fazendo algo errado. Neste caso você pode tentar locais de aninhamento.

Responder2

Por favor, verifique issolinkcomo eles disseram no NGINXdocumentação

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

As capturas nomeadas são um recurso do PCRE e possuem sintaxe diferente disponível em diferentes versões. Para a sintaxe que você usa? você deve ter pelo menos PCRE 7.0.

informação relacionada