Por que é desnecessário sair de “/” nas expressões regulares do Nginx?

3

Então, finalmente aprendi sobre expressões regulares. Normalmente, ao trabalhar com expressões regulares, é necessário escapar de delimitadores (como "/") com um "\". Mas quando estou usando expressões regulares no Nginx, parece que "/" é tratado literalmente e não como delimitador.

O Nginx usa o mecanismo PCRE para avaliar expressões regulares, portanto, não faz sentido para mim que você possa simplesmente inserir um delimitador sem escape sem quaisquer consequências.

Como exemplo, a expressão regular abaixo permite um único endereço IP e nega todos os outros:

location ~ /\.serverfault {
    allow 1.2.3.4;
    deny all;
}

Mas eu acho que precisaria ser assim para funcionar corretamente:

location ~ \/\.serverfault {
    allow 1.2.3.4;
    deny all;
}

O que estou perdendo aqui?

    
por Harold Fischer 18.01.2018 / 19:23

1 resposta

5

O motivo pelo qual você não precisa escapar de / é que / não é um delimitador.

Parece que você está acostumado a escrever expressões regulares em outros aplicativos, onde um delimitador é necessário. Por exemplo, em Perl você pode escrever algo como:

m/\/.serverfault/

A chave aqui é que você escolheu o delimitador . Não há nada de especial sobre / . Na verdade, você poderia usar praticamente qualquer personagem. # é bastante comum também.

m#/.serverfault#

Se você escolher um delimitador específico, e esse caractere aparecer na expressão regular, você deve escapar, ou escolher um delimitador diferente .

Como o nginx não precisa executar operações de substituição em correspondências de expressões regulares (por exemplo, s/old/new/ ), ele também não precisa usar um delimitador; assim, quando você especifica expressões regulares em nginx, nenhum delimitador é usado e (quase) nada precisa ser escapado.

    
por 18.01.2018 / 19:31