Использование '\' перед DOT в доменных именах в коде .htaccess

Многие веб-сайты предоставляют код .htaccess для блокировки спам-ботов, спам-рефералов и т. Д.

Некоторые веб-сайты используют '\' перед '.' в доменных именах. Например:

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

SetEnvIfNoCase Referer spamdomain\.com spambot=yes

Но некоторые веб-сайты используют прямое доменное имя. Например:

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

SetEnvIfNoCase Referer spamdomain.com spambot=yes

Теперь я не понимаю, какой синтаксис кода правильный? Оба кода работают нормально? Какой из них мне следует использовать?

2
задан 28 August 2017 в 22:11
1 ответ

Потому что второй аргумент директив RewriteCond и SetEnvIfNoCase - это регулярные выражения (regex), а не обычные строки. Regex использует специальный синтаксис для определения шаблонов поиска . В синтаксисе регулярных выражений точка / точка - это специальный (мета) символ, который представляет любой символ (кроме символов новой строки по умолчанию). Чтобы сопоставить буквальную точку (т. Е. Отключить ее особое значение), вам нужно экранировать точку с помощью обратной косой черты (т. Е. Поставить обратную косую черту перед точкой).

Итак, регулярное выражение вроде spamdomain \ .com соответствует литеральной строке spamdomain.com где угодно в проверяемой строке. (В первом примере он соответствует spamdomain.com где угодно в переменной сервера HTTP_REFERER .) Тогда как регулярное выражение, такое как spamdomain.com (где точка не экранирована) будет соответствовать spamdomainAcom , spamdomainBcom и т. д. Поскольку точка соответствует любому символу.

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

Строго говоря, это неверно. Регулярное выражение соответствует большему, чем предполагалось. Однако на самом деле это может не быть проблемой, если буквальная точка - единственный символ, который может появиться в этой позиции. (Но в этом случае точка должна быть экранирована.)

Ссылка:

9
ответ дан 3 December 2019 в 08:45

Теги

Похожие вопросы