.htaccess 代码用于阻止名称中包含 Windows 2001-2009 的 UserAgent

.htaccess 代码用于阻止名称中包含 Windows 2001-2009 的 UserAgent

我正在尝试阻止名称中包含以下内容的用户代理:

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]

上述代码是否正确或者是否有其他正确的代码形式可以执行此操作?

答案1

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而不是转义空格来明确显示空格\,因为空格可能难以阅读(并且难以在此处书写!)。或者,引用条件模式而不是转义空格。例如:

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如果您需要不区分大小写的匹配,请使用。

BrowserMatchSetEnvIf是根据 HTTP 请求标头有条件地设置环境变量的指令的一个特例User-Agent

参考:
https://httpd.apache.org/docs/2.4/mod/mod_setenvif.html

相关内容