Uso de '\' antes do DOT em nomes de domínio no código .htaccess

1

Muitos sites fornecem o código .htaccess para bloquear spambots, referências de spam, etc.

Alguns sites usam '\' antes do '.' em nomes de domínio. Por exemplo:

RewriteCond %{HTTP_REFERER} spamdomain\.com [NC,OR]

SetEnvIfNoCase Referer spamdomain\.com spambot=yes

Mas alguns sites usam nome de domínio direto. Por exemplo:

RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]

SetEnvIfNoCase Referer spamdomain.com spambot=yes

Agora estou confuso com qual sintaxe de código está correta? Ambos os códigos funcionam bem? Qual deles devo usar?

    
por TSA 28.08.2017 / 11:47

1 resposta

7

Como o segundo argumento para as diretivas RewriteCond e SetEnvIfNoCase são expressões regulares (regex), não cordas comuns. O Regex usa uma sintaxe especial para definir padrões de pesquisa . Na sintaxe de regex, o ponto / período é um caractere (meta) especial que representa qualquer caractere (exceto as novas linhas por padrão). A fim de combinar um ponto literal (ou seja, desabilitar o seu significado especial) você precisa fazer um backslash para escapar do ponto (ou seja, colocar uma barra invertida antes do ponto).

Então, um regex como spamdomain\.com corresponde à string literal spamdomain.com em qualquer lugar na string que está sendo testada. (No primeiro exemplo, corresponde a spamdomain.com em qualquer lugar na variável HTTP_REFERER server.) Considerando que uma regex como spamdomain.com (onde o ponto não é escapado) corresponderia a spamdomainAcom , spamdomainBcom , etc. Porque um ponto corresponde a qualquer caractere.

RewriteCond %{HTTP_REFERER} spamdomain.com [NC,OR]

Estritamente isso está incorreto. O regex corresponde mais do que o pretendido. No entanto, na realidade, isso pode não ser um problema se um ponto literal for o único caractere que poderia aparecer nessa posição. (Mas neste caso, o ponto deve ser escapado.)

Referência:

por 28.08.2017 / 12:07