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

我试图阻止其中包含以下名称的useragents:

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] 

上面的代码是否正确或者是否有任何其他正确的代码forms来执行此操作?

 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指令。 或者,有些人可能更喜欢使用短字符类来显式地显示空格,而不是转义空格\ ,因为空格可能很难阅读(而且很难写在这里!)。 或者,引用CondPattern而不是转义空间。 例如:

 RewriteCond %{HTTP_USER_AGENT} "Windows 200[1-9]" [NC] 

无论什么对你有用。

用正则expression式,如果你想表示用户代理包含模式,你不需要.*在模式之前和之后。 这是默认的正则expression式的行为。 如果你使用F标志,你不需要L标志 – 这是隐含的。 如果没有被使用,则不需要捕获RewriteRule 。 所以,而不是^(.*)$你可以简单地写.*^ (我的偏好)。

如果匹配的string总是 “Windows”(其余大写字母“W”,小写字母),则不需要NC标志。

更新:

在RewriteRule语句中使用^(.*)$.*^什么区别?

^(.*)$ – 这明确地抓取了string(URL-path)的开始和结束之间的所有内容,并将其保存在$1反向引用中以供稍后使用(如果您愿意的话)。 ^是string开始的锚点, $是string锚点的结尾。

.* – 这匹配一切 。 任何字符0或更多次。

^ – 这只是string锚的开始,所以它匹配任何东西

在上面的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指令的一个特例,它在User-Agent HTTP请求标头上有条件地设置环境variables。

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