Назад | Перейти на главную страницу

.htaccess код для блокировки UserAgents, содержащих Windows 2001-2009 в именах

Я пытаюсь заблокировать пользовательские агенты, имена которых содержат следующее:

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