RewriteCond %{HTTP_USER_AGENT} .*Windows\ 200[1-9].* [NC] RewriteRule ^(.*)$ - [F,L]
O que você tem que funcionar OK. Poderia ser arrumado um pouco ...
RewriteCond %{HTTP_USER_AGENT} Windows\ 200[1-9] [NC]
RewriteRule ^ - [F]
Supondo que você já tenha uma diretiva RewriteEngine On
em algum lugar. Ou, alguns podem preferir mostrar explicitamente o espaço em branco usando a classe de caractere abreviada \s
em vez de um espaço com escape \
, pois os espaços podem ser difíceis de ler (e difíceis de escrever aqui!). Alternativamente, cite o CondPattern em vez de escapar do espaço. Por exemplo:
RewriteCond %{HTTP_USER_AGENT} "Windows 200[1-9]" [NC]
Tudo o que funciona para você.
Com regex, você não precisa de .*
antes e depois de um padrão se quiser expressar que o user-agent contém o padrão. Esse é o comportamento padrão do regex. E se você usar o sinalizador F
, não precisará do sinal L
- está implícito. E não é necessário capturar o RewriteRule
se não estiver sendo usado. Então, em vez de ^(.*)$
, você pode simplesmente escrever .*
ou ^
(minha preferência).
Se a string que está sendo correspondida é sempre "Windows" (com um "W" maiúsculo e minúscula para o resto), então você não precisa do NC
flag.
ATUALIZAÇÃO:
what's the difference between
^(.*)$
,.*
and^
in using in RewriteRule statement?
^(.*)$
- explicitamente captura tudo entre o início e o final da string (URL-path) e salva isso na $1
backreference a ser usada posteriormente (se você desejar). ^
é a âncora do início da string e $
é o final da âncora da string.
.*
- corresponde a tudo . Qualquer caractere 0 ou mais vezes.
^
- Este é simplesmente um começo de âncora de string, então ele corresponde a qualquer coisa .
No RewriteRule
acima, não nos importamos com o URL solicitado, estamos interessados apenas no User-Agent, então corresponder qualquer coisa é suficiente.
Como alternativa, use mod_setenvif em vez disso. De certa forma, isso seria preferível ao uso de mod_rewrite (acima). (Embora eu acredite que você fez algo assim usando SetEnvIf
em outra pergunta e não funcionou para você por algum motivo?)
BrowserMatch "Windows 200[1-9]" bad_agent
<RequireAll>
Require all granted
Require not env bad_agent
</RequireAll>
Assumindo o Apache 2.4+. Isso seria usado em combinação com qualquer outra regra de bloqueio que você possua (portanto, talvez seja necessário modificar).
Use BrowserMatchNoCase
se você precisar de uma correspondência sem distinção entre maiúsculas e minúsculas.
BrowserMatch
is a special case of theSetEnvIf
directive that sets environment variables conditionally on theUser-Agent
HTTP request header.
Referência:
link