我正在尝试阻止名称中包含以下内容的用户代理:
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
如果您需要不区分大小写的匹配,请使用。
BrowserMatch
SetEnvIf
是根据 HTTP 请求标头有条件地设置环境变量的指令的一个特例User-Agent
。