我正在尝试阻止名称中包含以下内容的用户代理:
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]
上面的代码是正确的还是有其他正确形式的代码可以做到这一点?
你所拥有的应该可以正常工作。可以稍微整理一下...
假设你已经在
RewriteEngine On
某处有一个指令。或者,有些人可能更喜欢使用简写字符类\s
而不是转义的空格来显式显示空格\
,因为空格可能难以阅读(在这里也很难写!)。或者,引用CondPattern而不是转义空格。例如:什么都适合你。
.*
使用正则表达式,如果您想表达用户代理包含模式,则不需要在模式之前和之后。这是默认的正则表达式行为。如果你使用F
标志,你就不需要L
标志 - 它是隐含的。RewriteRule
如果它没有被使用,则无需捕获它。^(.*)$
因此,您可以简单地写.*
或^
(我的偏好)来代替。如果要匹配的字符串始终为“Windows”(大写“W”,其余为小写),则不需要该
NC
标志。更新:
^(.*)$
- 这明确地抓取字符串(URL 路径)的开头和结尾之间的所有内容,并将其保存在后向$1
引用中以供以后使用(如果您愿意)。^
是弦锚的起点,也是弦锚$
的终点。.*
- 这符合一切。任何字符 0 次或多次。^
- 这只是字符串锚的开始,所以它匹配任何东西。在上面
RewriteRule
,我们不关心请求的 URL 是什么,我们只对 User-Agent 感兴趣,所以匹配任何内容就足够了。或者,改用 mod_setenvif。在某些方面,这比使用 mod_rewrite(上图)更可取。(尽管我相信您
SetEnvIf
在另一个问题中使用了类似的方法,但由于某种原因它对您不起作用?)假设 Apache 2.4+。这将与您拥有的任何其他阻止规则结合使用(因此,可能需要修改)。
BrowserMatchNoCase
如果您需要不区分大小写的匹配,请使用。参考:
https ://httpd.apache.org/docs/2.4/mod/mod_setenvif.html