Я пытаюсь заблокировать пользовательские агенты, имена которых содержат следующее:
Windows 2001
Windows 2002
Windows 2003
Windows 2004
Windows 2005
Windows 2006
Windows 2007
Windows 2008
Windows 2009
Я буду использовать следующий код в .htaccess
файл:
RewriteCond %{HTTP_USER_AGENT} .*Windows\ 200[1-9].* [NC]
RewriteRule ^(.*)$ - [F,L]
Правильный ли приведенный выше код или есть другая правильная форма кода для этого?
RewriteCond %{HTTP_USER_AGENT} .*Windows\ 200[1-9].* [NC] RewriteRule ^(.*)$ - [F,L]
То, что у вас есть, должно работать нормально. Это можно было бы немного привести в порядок ...
RewriteCond %{HTTP_USER_AGENT} Windows\ 200[1-9] [NC]
RewriteRule ^ - [F]
Предполагая, что у вас уже есть RewriteEngine On
директива где-нибудь. Или некоторые могут предпочесть явно отображать пробелы, используя сокращенный класс символов \s
вместо сбежавшего пробела \
, так как пробелы могут быть трудночитаемыми (и трудно здесь писать!). Или процитируйте CondPattern вместо выхода из пробела. Например:
RewriteCond %{HTTP_USER_AGENT} "Windows 200[1-9]" [NC]
Все, что вам подходит.
С регулярным выражением вам не нужно .*
до и после шаблона, если вы хотите выразить, что пользовательский агент содержит шаблон. Это поведение регулярного выражения по умолчанию. И если вы используете F
флаг, вам не нужен L
флаг - подразумевается. И не нужно снимать RewriteRule
если он не используется. Итак, вместо ^(.*)$
вы можете просто написать .*
или ^
(мои предпочтения).
Если совпадающая строка всегда "Windows" (с заглавной "W" и строчными буквами для остальных), то вам не нужен NC
флаг.
ОБНОВИТЬ:
какая разница между
^(.*)$
,.*
и^
в использовании в заявлении RewriteRule?
^(.*)$
- Это явно захватывает все между началом и концом строки (URL-путь) и сохраняет это в $1
обратная ссылка для использования позже (если хотите). ^
является привязкой начала строки и $
- конец привязки строки.
.*
- Это соответствует все. Любой символ 0 или более раз.
^
- Это просто начало привязки строки, поэтому оно соответствует что-нибудь.
В приведенном выше RewriteRule
, нас не волнует запрошенный URL, нас интересует только User-Agent, поэтому соответствие что-нибудь достаточно.
В качестве альтернативы используйте вместо этого mod_setenvif. В некотором смысле это было бы предпочтительнее использования mod_rewrite (см. Выше). (Хотя я считаю, что вы сделали что-то подобное, используя SetEnvIf
в другом вопросе, а у вас почему-то не сработало?)
BrowserMatch "Windows 200[1-9]" bad_agent
<RequireAll>
Require all granted
Require not env bad_agent
</RequireAll>
Предполагая, что Apache 2.4+. Это будет использоваться в сочетании с любыми другими правилами блокировки, которые у вас есть (поэтому может потребоваться изменение).
Использовать BrowserMatchNoCase
если вам нужно совпадение без учета регистра.
BrowserMatch
это частный случайSetEnvIf
директива, которая устанавливает переменные среды условно наUser-Agent
Заголовок HTTP-запроса.
Ссылка:
https://httpd.apache.org/docs/2.4/mod/mod_setenvif.html