我试图阻止其中包含以下名称的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
。
BrowserMatch
是SetEnvIf
指令的一个特例,它在User-Agent
HTTP请求标头上有条件地设置环境variables。