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