RewriteCond %{HTTP_USER_AGENT} Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36
空格是 Apache 配置文件中的分隔符。所以你可能会遇到一个错误无效标志(如果您检查错误日志 - 浏览器可能只会报告 500 错误)。您需要反斜杠转义用户代理字符串中的空格,或者将整个用户代理括起来(即条件模式- 第二个参数RewriteCond
指令)用双引号引起来。另请注意,默认情况下这是一个正则表达式,因此任何特殊/元正则表达式字符也需要转义(包括.
, (
and )
).
例如,请尝试以下操作:
RewriteCond %{HTTP_USER_AGENT} "^Mozilla/5\.0 \(X11; Linux x86_64\) AppleWebKit/537\.36 \(KHTML, like Gecko\) Ubuntu HeadlessChrome HeadlessChrome Safari/537\.36$"
RewriteRule .* - [F]
这将返回 403 Forbidden,而不是 503 Service Unavailable(这实际上是临时状态)。
或者,要执行字典字符串比较(精确匹配),您可以使用=
上的前缀运算符条件模式。例如:
RewriteCond %{HTTP_USER_AGENT} "=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36"
The 条件模式现在被视为普通字符串(不是正则表达式),因此无需转义特殊字符。
不用说,这应该放在你的顶部.htaccess
file - 与任何其他阻止指令一起。
UPDATE:
如果 mod_rewrite 指令被覆盖(可能来自.htaccess
文件在子目录中),那么您可以使用 mod_setenvif 和 mod_authz_core (Apache 2.4+) 的组合,如下所示:
BrowserMatch "^Mozilla/5\.0 \(X11; Linux x86_64\) AppleWebKit/537\.36 \(KHTML, like Gecko\) Ubuntu HeadlessChrome HeadlessChrome Safari/537\.36$" block_it
<RequireAll>
Require all granted
Require not env block_it
</RequireAll>
如上所述,这是 Apache 2.4+ 语法。