Многие веб-сайты предоставляют код .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
Теперь я не понимаю, какой синтаксис кода правильный? Оба кода работают нормально? Какой из них мне следует использовать?
Потому что второй аргумент директив RewriteCond
и SetEnvIfNoCase
- это регулярные выражения (regex), а не обычные строки. Regex использует специальный синтаксис для определения шаблонов поиска . В синтаксисе регулярных выражений точка / точка - это специальный (мета) символ, который представляет любой символ (кроме символов новой строки по умолчанию). Чтобы сопоставить буквальную точку (т. Е. Отключить ее особое значение), вам нужно экранировать точку с помощью обратной косой черты (т. Е. Поставить обратную косую черту перед точкой).
Итак, регулярное выражение вроде spamdomain \ .com
соответствует литеральной строке spamdomain.com
где угодно в проверяемой строке. (В первом примере он соответствует spamdomain.com
где угодно в переменной сервера HTTP_REFERER
.) Тогда как регулярное выражение, такое как spamdomain.com
(где точка не экранирована) будет соответствовать spamdomainAcom
, spamdomainBcom
и т. д. Поскольку точка соответствует любому символу.
RewriteCond% {HTTP_REFERER} spamdomain.com [NC, OR]
Строго говоря, это неверно. Регулярное выражение соответствует большему, чем предполагалось. Однако на самом деле это может не быть проблемой, если буквальная точка - единственный символ, который может появиться в этой позиции. (Но в этом случае точка должна быть экранирована.)
Ссылка: